dma_alloc_from_coherent does not get struct dma_attrs information. If dma_attrs information is passed to dma_alloc_from_coherent, dma_alloc_from_coherent can do more jobs accodring to the information. As a example I added DMA_ATTR_SKIP_ZEROING to skip zeroing. Accoring to driver implementation ZEROING could be skipped or could be done later. Signed-off-by: Jaewon Kim <jaewon31.kim@xxxxxxxxxxx> --- drivers/base/dma-coherent.c | 6 +++++- include/linux/dma-mapping.h | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/base/dma-coherent.c b/drivers/base/dma-coherent.c index 640a7e6..428eced 100644 --- a/drivers/base/dma-coherent.c +++ b/drivers/base/dma-coherent.c @@ -151,6 +151,7 @@ void *dma_mark_declared_memory_occupied(struct device *dev, * @dma_handle: This will be filled with the correct dma handle * @ret: This pointer will be filled with the virtual address * to allocated area. + * @attrs: dma_attrs to pass additional information * * This function should be only called from per-arch dma_alloc_coherent() * to support allocation from per-device coherent memory pools. @@ -159,7 +160,8 @@ void *dma_mark_declared_memory_occupied(struct device *dev, * generic memory areas, or !0 if dma_alloc_coherent should return @ret. */ int dma_alloc_from_coherent(struct device *dev, ssize_t size, - dma_addr_t *dma_handle, void **ret) + dma_addr_t *dma_handle, void **ret, + struct dma_attrs *attrs) { struct dma_coherent_mem *mem; int order = get_order(size); @@ -190,6 +192,8 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size, *ret = mem->virt_base + (pageno << PAGE_SHIFT); dma_memory_map = (mem->flags & DMA_MEMORY_MAP); spin_unlock_irqrestore(&mem->spinlock, flags); + if (dma_get_attr(DMA_ATTR_SKIP_ZEROING, attrs)) + return 1; if (dma_memory_map) memset(*ret, 0, size); else diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 08528af..737fd71 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -151,13 +151,14 @@ static inline int is_device_dma_capable(struct device *dev) * Don't use them in device drivers. */ int dma_alloc_from_coherent(struct device *dev, ssize_t size, - dma_addr_t *dma_handle, void **ret); + dma_addr_t *dma_handle, void **ret, + struct dma_attrs *attrs); int dma_release_from_coherent(struct device *dev, int order, void *vaddr); int dma_mmap_from_coherent(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, size_t size, int *ret); #else -#define dma_alloc_from_coherent(dev, size, handle, ret) (0) +#define dma_alloc_from_coherent(dev, size, handle, ret, attrs) (0) #define dma_release_from_coherent(dev, order, vaddr) (0) #define dma_mmap_from_coherent(dev, vma, vaddr, order, ret) (0) #endif /* CONFIG_HAVE_GENERIC_DMA_COHERENT */ @@ -456,7 +457,7 @@ static inline void *dma_alloc_attrs(struct device *dev, size_t size, BUG_ON(!ops); - if (dma_alloc_from_coherent(dev, size, dma_handle, &cpu_addr)) + if (dma_alloc_from_coherent(dev, size, dma_handle, &cpu_addr, attrs)) return cpu_addr; if (!arch_dma_alloc_attrs(&dev, &flag)) -- 1.9.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>