From 0bf6f5ab1502115fcc3353ad1892c1c0cf148dd9 Mon Sep 17 00:00:00 2001 From: Laura Abbott Date: Thu, 22 May 2014 14:38:48 -0700 Subject: [PATCH] arm: Add option to skip buffer zeroing The DMA framework currently zeros all buffers because it (righfully so) assumes that drivers will soon need to pass the memory to a device. Some devices/use case may not require zeroed memory and there can be an increase in performance if we skip the zeroing. Add a DMA_ATTR to allow skipping of DMA zeroing. Change-Id: Ib78a19cb341c3c441f91d5b004c6375c80c10413 Signed-off-by: Laura Abbott [pdaly@codeaurora.org Resolve minor conflicts] Signed-off-by: Patrick Daly --- arch/arm/mm/dma-mapping.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 8fa0ef24d7dc..d419f0482407 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -310,7 +310,8 @@ static void __dma_free_buffer(struct page *page, size_t size) static void *__alloc_from_contiguous(struct device *dev, size_t size, pgprot_t prot, struct page **ret_page, - const void *caller, bool want_vaddr); + const void *caller, + struct dma_attrs *attrs); static void *__alloc_remap_buffer(struct device *dev, size_t size, gfp_t gfp, pgprot_t prot, struct page **ret_page, @@ -378,7 +379,7 @@ static int __init atomic_pool_init(void) if (dev_get_cma_area(NULL)) ptr = __alloc_from_contiguous(NULL, atomic_pool_size, prot, - &page, atomic_pool_init, true); + &page, atomic_pool_init, NULL); else ptr = __alloc_remap_buffer(NULL, atomic_pool_size, gfp, prot, &page, atomic_pool_init, true); @@ -560,18 +561,22 @@ static int __free_from_pool(void *start, size_t size) static void *__alloc_from_contiguous(struct device *dev, size_t size, pgprot_t prot, struct page **ret_page, - const void *caller, bool want_vaddr) + const void *caller, + struct dma_attrs *attrs) { unsigned long order = get_order(size); size_t count = size >> PAGE_SHIFT; struct page *page; void *ptr = NULL; + bool want_vaddr = !dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, + attrs); page = dma_alloc_from_contiguous(dev, count, order); if (!page) return NULL; - __dma_clear_buffer(page, size); + if (!dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs)) + __dma_clear_buffer(page, size); if (!want_vaddr) goto out; @@ -688,7 +693,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, addr = __alloc_simple_buffer(dev, size, gfp, &page); else if (dev_get_cma_area(dev) && (gfp & __GFP_DIRECT_RECLAIM)) addr = __alloc_from_contiguous(dev, size, prot, &page, - caller, want_vaddr); + caller, attrs); else if (is_coherent) addr = __alloc_simple_buffer(dev, size, gfp, &page); else if (!gfpflags_allow_blocking(gfp)) -- 2.11.0