From: Alex Williamson <alex.williamson@hp.com>
To: dwmw2@infradead.org
Cc: iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org,
akpm@linux-foundation.org, alex.williamson@hp.com
Subject: [PATCH] intel-iommu: Obey coherent_dma_mask for alloc_coherent on passthrough
Date: Wed, 04 Nov 2009 15:59:34 -0700 [thread overview]
Message-ID: <20091104225359.2720.91502.stgit@nehalem.aw> (raw)
intel_alloc_coherent() needs to follow DMA mapping convention and
make use of the coherent_dma_mask of the device for identity mappings.
Without this, devices may get buffers they can't use. This patch
provides best effort allocations and fails the request if the mask
requirements are not met rather than returning an unusable buffer.
Signed-off-by: Alex Williamson <alex.williamson@hp.com>
---
This patch fixes a regression introduced since 2.6.31 that prevents
devices with a restricted coherent_dma_mask from working in passthrough
mode.
drivers/pci/intel-iommu.c | 12 ++++++++++--
1 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
index b1e97e6..8283df9 100644
--- a/drivers/pci/intel-iommu.c
+++ b/drivers/pci/intel-iommu.c
@@ -2582,7 +2582,7 @@ static dma_addr_t __intel_map_single(struct device *hwdev, phys_addr_t paddr,
BUG_ON(dir == DMA_NONE);
if (iommu_no_mapping(hwdev))
- return paddr;
+ return paddr + size > dma_mask ? 0 : paddr;
domain = get_valid_domain_for_dev(pdev);
if (!domain)
@@ -2767,7 +2767,15 @@ static void *intel_alloc_coherent(struct device *hwdev, size_t size,
size = PAGE_ALIGN(size);
order = get_order(size);
- flags &= ~(GFP_DMA | GFP_DMA32);
+
+ if (!iommu_no_mapping(hwdev))
+ flags &= ~(GFP_DMA | GFP_DMA32);
+ else if (hwdev->coherent_dma_mask != DMA_BIT_MASK(64)) {
+ if (hwdev->coherent_dma_mask < DMA_BIT_MASK(32))
+ flags |= GFP_DMA;
+ else
+ flags |= GFP_DMA32;
+ }
vaddr = (void *)__get_free_pages(flags, order);
if (!vaddr)
next reply other threads:[~2009-11-04 23:03 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-04 22:59 Alex Williamson [this message]
2009-11-06 2:41 ` FUJITA Tomonori
2009-11-06 3:19 ` Alex Williamson
2009-11-06 3:34 ` FUJITA Tomonori
2009-11-06 4:09 ` Alex Williamson
2009-11-09 23:02 ` David Woodhouse
2009-11-09 23:32 ` Alex Williamson
2009-11-10 0:19 ` David Woodhouse
2009-11-11 15:23 ` [stable][PATCH] PCIe hot-plug for Intel IOMMU Fenghua Yu
2009-11-11 21:27 ` Yinghai Lu
2009-11-28 6:17 ` David Woodhouse
2009-11-12 2:37 ` David Woodhouse
2009-11-12 23:32 ` Yu, Fenghua
2009-11-10 0:46 ` [PATCH] intel-iommu: Obey coherent_dma_mask for alloc_coherent on passthrough David Woodhouse
2009-11-10 1:01 ` David Woodhouse
2009-11-10 1:28 ` Alex Williamson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091104225359.2720.91502.stgit@nehalem.aw \
--to=alex.williamson@hp.com \
--cc=akpm@linux-foundation.org \
--cc=dwmw2@infradead.org \
--cc=iommu@lists.linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®