The patch titled Subject: mm/dmapool.c: avoid duplicate memset within dma_pool_alloc has been added to the -mm mm-unstable branch. Its filename is mm-dmapoolc-avoid-duplicate-memset-within-dma_pool_alloc.patch This patch will shortly appear at https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-dmapoolc-avoid-duplicate-memset-within-dma_pool_alloc.patch This patch will later appear in the mm-unstable branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next via the mm-everything branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm and is updated there every 2-3 working days ------------------------------------------------------ From: Liu Song <liusong@xxxxxxxxxxxxxxxxx> Subject: mm/dmapool.c: avoid duplicate memset within dma_pool_alloc Date: Mon, 18 Jul 2022 14:28:10 +0800 In "dma_alloc_from_dev_coherent" and "dma_direct_alloc", the allocated memory is explicitly set to 0. A helper function "use_dev_coherent_memory" is introduced here to determine whether the memory is allocated by "dma_alloc_from_dev_coherent". And use "get_dma_ops" to determine whether the memory is allocated by "dma_direct_alloc". After this modification, memory allocated using "dma_pool_zalloc" can avoid duplicate memset. Link: https://lkml.kernel.org/r/1658125690-76930-1-git-send-email-liusong@xxxxxxxxxxxxxxxxx Signed-off-by: Liu Song <liusong@xxxxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- include/linux/dma-map-ops.h | 5 +++++ mm/dmapool.c | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) --- a/include/linux/dma-map-ops.h~mm-dmapoolc-avoid-duplicate-memset-within-dma_pool_alloc +++ a/include/linux/dma-map-ops.h @@ -183,6 +183,10 @@ int dma_alloc_from_dev_coherent(struct d int dma_release_from_dev_coherent(struct device *dev, int order, void *vaddr); int dma_mmap_from_dev_coherent(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, size_t size, int *ret); +static inline bool use_dev_coherent_memory(struct device *dev) +{ + return dev->dma_mem ? true : false; +} #else static inline int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr, dma_addr_t device_addr, size_t size) @@ -194,6 +198,7 @@ static inline int dma_declare_coherent_m #define dma_release_from_dev_coherent(dev, order, vaddr) (0) #define dma_mmap_from_dev_coherent(dev, vma, vaddr, order, ret) (0) static inline void dma_release_coherent_memory(struct device *dev) { } +#define use_dev_coherent_memory(dev) (0) #endif /* CONFIG_DMA_DECLARE_COHERENT */ #ifdef CONFIG_DMA_GLOBAL_POOL --- a/mm/dmapool.c~mm-dmapoolc-avoid-duplicate-memset-within-dma_pool_alloc +++ a/mm/dmapool.c @@ -21,6 +21,7 @@ #include <linux/device.h> #include <linux/dma-mapping.h> +#include <linux/dma-map-ops.h> #include <linux/dmapool.h> #include <linux/kernel.h> #include <linux/list.h> @@ -372,7 +373,9 @@ void *dma_pool_alloc(struct dma_pool *po #endif spin_unlock_irqrestore(&pool->lock, flags); - if (want_init_on_alloc(mem_flags)) + if (want_init_on_alloc(mem_flags) && + !use_dev_coherent_memory(pool->dev) && + get_dma_ops(pool->dev)) memset(retval, 0, pool->size); return retval; _ Patches currently in -mm which might be from liusong@xxxxxxxxxxxxxxxxx are mm-dmapoolc-avoid-duplicate-memset-within-dma_pool_alloc.patch