Linux IOMMU Development
 help / color / mirror / Atom feed
* [PATCH 0/2] extend support for CMA CMA on x86
@ 2013-11-29 14:51 Akinobu Mita
       [not found] ` <1385736706-3147-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2013-11-29 19:59 ` [PATCH 0/2] extend support for CMA CMA on x86 Andi Kleen
  0 siblings, 2 replies; 3+ messages in thread
From: Akinobu Mita @ 2013-11-29 14:51 UTC (permalink / raw)
  To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b
  Cc: Andi Kleen, x86-DgEjT+Ai2ygdnm+yROfE0A, Akinobu Mita,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA, Ingo Molnar,
	H. Peter Anvin, Thomas Gleixner, David Woodhouse

This patch set extends support for the DMA Contiguous Memory Allocator
on x86.  Currently it is only supported on pci-nommu.  So this aims at
enabling it on swiotlb and intel-iommu, too.

Regardless of which dma mapping implementation is actually used in the
system, I would like to allocate big contiguous memory with
dma_alloc_coherent() and tell the base address to the device that
requires it.  This is why I need this change.

Akinobu Mita (2):
  x86: enable DMA CMA with swiotlb
  intel-iommu: integrate DMA CMA

 arch/x86/Kconfig               |  2 +-
 arch/x86/include/asm/swiotlb.h |  7 +++++++
 arch/x86/kernel/amd_gart_64.c  |  2 +-
 arch/x86/kernel/pci-swiotlb.c  |  9 ++++++---
 arch/x86/pci/sta2x11-fixup.c   |  6 ++----
 drivers/iommu/intel-iommu.c    | 32 ++++++++++++++++++++++++--------
 include/linux/swiotlb.h        |  2 ++
 lib/swiotlb.c                  |  2 +-
 8 files changed, 44 insertions(+), 18 deletions(-)

Cc: Marek Szyprowski <m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
Cc: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
Cc: Ingo Molnar <mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: "H. Peter Anvin" <hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
Cc: x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Cc: Andi Kleen <andi-Vw/NltI1exuRpAAqCnN02g@public.gmane.org>
Cc: David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
-- 
1.8.3.2

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 2/2] intel-iommu: integrate DMA CMA
       [not found] ` <1385736706-3147-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2013-11-29 14:51   ` Akinobu Mita
  0 siblings, 0 replies; 3+ messages in thread
From: Akinobu Mita @ 2013-11-29 14:51 UTC (permalink / raw)
  To: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b
  Cc: x86-DgEjT+Ai2ygdnm+yROfE0A, Akinobu Mita,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA, Ingo Molnar,
	H. Peter Anvin, Thomas Gleixner, David Woodhouse

This adds support for the DMA Contiguous Memory Allocator for intel-iommu.
This change enables dma_alloc_coherent() to allocate big contiguous
memory.

It is achieved in the same way as nommu_dma_ops currently does, i.e.
trying to allocate memory by dma_alloc_from_contiguous() and alloc_pages()
is used as a fallback.

Cc: Marek Szyprowski <m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
Cc: David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
Cc: Thomas Gleixner <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
Cc: Ingo Molnar <mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: "H. Peter Anvin" <hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>
Cc: x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
Signed-off-by: Akinobu Mita <akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 drivers/iommu/intel-iommu.c | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index fd426ca..172c2b0 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -3004,7 +3004,7 @@ static void *intel_alloc_coherent(struct device *hwdev, size_t size,
 				  dma_addr_t *dma_handle, gfp_t flags,
 				  struct dma_attrs *attrs)
 {
-	void *vaddr;
+	struct page *page = NULL;
 	int order;
 
 	size = PAGE_ALIGN(size);
@@ -3019,17 +3019,31 @@ static void *intel_alloc_coherent(struct device *hwdev, size_t size,
 			flags |= GFP_DMA32;
 	}
 
-	vaddr = (void *)__get_free_pages(flags, order);
-	if (!vaddr)
+	if (!(flags & GFP_ATOMIC)) {
+		unsigned int count = size >> PAGE_SHIFT;
+
+		page = dma_alloc_from_contiguous(hwdev, count, order);
+		if (page && iommu_no_mapping(hwdev) &&
+		    page_to_phys(page) + size > hwdev->coherent_dma_mask) {
+			dma_release_from_contiguous(hwdev, page, count);
+			page = NULL;
+		}
+	}
+
+	if (!page)
+		page = alloc_pages(flags, order);
+	if (!page)
 		return NULL;
-	memset(vaddr, 0, size);
+	memset(page_address(page), 0, size);
 
-	*dma_handle = __intel_map_single(hwdev, virt_to_bus(vaddr), size,
+	*dma_handle = __intel_map_single(hwdev, page_to_phys(page), size,
 					 DMA_BIDIRECTIONAL,
 					 hwdev->coherent_dma_mask);
 	if (*dma_handle)
-		return vaddr;
-	free_pages((unsigned long)vaddr, order);
+		return page_address(page);
+	if (!dma_release_from_contiguous(hwdev, page, size >> PAGE_SHIFT))
+		__free_pages(page, order);
+
 	return NULL;
 }
 
@@ -3037,12 +3051,14 @@ static void intel_free_coherent(struct device *hwdev, size_t size, void *vaddr,
 				dma_addr_t dma_handle, struct dma_attrs *attrs)
 {
 	int order;
+	struct page *page = virt_to_page(vaddr);
 
 	size = PAGE_ALIGN(size);
 	order = get_order(size);
 
 	intel_unmap_page(hwdev, dma_handle, size, DMA_BIDIRECTIONAL, NULL);
-	free_pages((unsigned long)vaddr, order);
+	if (!dma_release_from_contiguous(hwdev, page, size >> PAGE_SHIFT))
+		__free_pages(page, order);
 }
 
 static void intel_unmap_sg(struct device *hwdev, struct scatterlist *sglist,
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 0/2] extend support for CMA CMA on x86
  2013-11-29 14:51 [PATCH 0/2] extend support for CMA CMA on x86 Akinobu Mita
       [not found] ` <1385736706-3147-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2013-11-29 19:59 ` Andi Kleen
  1 sibling, 0 replies; 3+ messages in thread
From: Andi Kleen @ 2013-11-29 19:59 UTC (permalink / raw)
  To: Akinobu Mita
  Cc: linux-kernel, akpm, Marek Szyprowski, Konrad Rzeszutek Wilk,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, x86, Andi Kleen,
	David Woodhouse, iommu

On Fri, Nov 29, 2013 at 11:51:44PM +0900, Akinobu Mita wrote:
> This patch set extends support for the DMA Contiguous Memory Allocator
> on x86.  Currently it is only supported on pci-nommu.  So this aims at
> enabling it on swiotlb and intel-iommu, too.
> 
> Regardless of which dma mapping implementation is actually used in the
> system, I would like to allocate big contiguous memory with
> dma_alloc_coherent() and tell the base address to the device that
> requires it.  This is why I need this change.

I think it's generally the right direction. CMA is much better
than the DMA zone (e.g. it can actually (mostly) share memory,
while lower zone protection keeps the DMA zone free)
Also it works for more than 16MB / 64MB.

So i hope longer term we can just kill GFP_DMA and replace
it with some CMA variant everywhere.

There are also other potential users that could make use of it,
but they need to interoperate with swiotlb, so something liike
this is needed.

-Andi

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-11-29 19:59 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-29 14:51 [PATCH 0/2] extend support for CMA CMA on x86 Akinobu Mita
     [not found] ` <1385736706-3147-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-11-29 14:51   ` [PATCH 2/2] intel-iommu: integrate DMA CMA Akinobu Mita
2013-11-29 19:59 ` [PATCH 0/2] extend support for CMA CMA on x86 Andi Kleen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox