[PATCH] ARM: dma-mapping: Fix wrong free function in __iommu_alloc_simple() error path

Marek Szyprowski m.szyprowski at samsung.com
Tue Jul 7 04:28:35 PDT 2026


On 26.06.2026 12:11, lirongqing wrote:
> From: Li RongQing <lirongqing at baidu.com>
>
> In __iommu_alloc_simple(), when IOMMU mapping creation fails, the error
> path unconditionally called __free_from_pool() regardless of the
> allocation path taken.
>
> For the COHERENT case, memory is allocated via __alloc_simple_buffer(),
> which does not use the atomic pool. Calling __free_from_pool() on such
> memory silently returns without freeing, causing a page memory leak.
>
> Fix this by matching the free function to the allocation path:
> - COHERENT: use __dma_free_buffer(virt_to_page(addr), size)
> - non-COHERENT: use __free_from_pool(addr, size)
>
> Fixes: 565068221b905 ("ARM: 8561/4: dma-mapping: Fix the coherent case when iommu is used")
> Signed-off-by: Li RongQing <lirongqing at baidu.com>

Reviewed-by: Marek Szyprowski <m.szyprowski at samsung.com>

Please upload Your patch to https://www.arm.linux.org.uk/developer/patches/


> ---
>  arch/arm/mm/dma-mapping.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
> index f9bc53b..55d3d3b 100644
> --- a/arch/arm/mm/dma-mapping.c
> +++ b/arch/arm/mm/dma-mapping.c
> @@ -1056,7 +1056,10 @@ static void *__iommu_alloc_simple(struct device *dev, size_t size, gfp_t gfp,
>  	return addr;
>  
>  err_mapping:
> -	__free_from_pool(addr, size);
> +	if (coherent_flag == COHERENT)
> +		__dma_free_buffer(virt_to_page(addr), size);
> +	else
> +		__free_from_pool(addr, size);
>  	return NULL;
>  }
>  

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland




More information about the linux-arm-kernel mailing list