Commit b31ac41b authored by Robin Murphy's avatar Robin Murphy Committed by Marek Szyprowski
Browse files

dma/pool: Improve pool lookup



If CONFIG_ZONE_DMA32 is enabled, but we have not allocated the
corresponding atomic_pool_dma32, dma_guess_pool() may return the NULL
value of that and fail a GFP_DMA32 allocation without trying to fall
back to other pools which may exist. Furthermore, if no GFP_DMA pool
exists, it is preferable to try GFP_DMA32 rather than immediately fall
back to GFP_KERNEL with even less chance of success. Improve matters
by encoding an explicit order of pool preference for each flag.

Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
Tested-by: default avatarVladimir Kondratiev <vladimir.kondratiev@mobileye.com>
Reviewed-by: default avatarBaoquan He <bhe@redhat.com>
Signed-off-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/c846b1a2f43295cac926c7af2ce907f62baec518.1768230104.git.robin.murphy@arm.com
parent 7f2e8e1d
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -224,10 +224,10 @@ postcore_initcall(dma_atomic_pool_init);
static inline struct gen_pool *dma_guess_pool(struct gen_pool *prev, gfp_t gfp)
{
	if (prev == NULL) {
		if (IS_ENABLED(CONFIG_ZONE_DMA32) && (gfp & GFP_DMA32))
			return atomic_pool_dma32;
		if (atomic_pool_dma && (gfp & GFP_DMA))
			return atomic_pool_dma;
		if (gfp & GFP_DMA)
			return atomic_pool_dma ?: atomic_pool_dma32 ?: atomic_pool_kernel;
		if (gfp & GFP_DMA32)
			return atomic_pool_dma32 ?: atomic_pool_dma ?: atomic_pool_kernel;
		return atomic_pool_kernel;
	}
	if (prev == atomic_pool_kernel)