]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dma/pool: Improve pool lookup
authorRobin Murphy <robin.murphy@arm.com>
Mon, 12 Jan 2026 15:46:36 +0000 (15:46 +0000)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 14 Jan 2026 10:00:00 +0000 (11:00 +0100)
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: Robin Murphy <robin.murphy@arm.com>
Tested-by: Vladimir Kondratiev <vladimir.kondratiev@mobileye.com>
Reviewed-by: Baoquan He <bhe@redhat.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/c846b1a2f43295cac926c7af2ce907f62baec518.1768230104.git.robin.murphy@arm.com
kernel/dma/pool.c

index 26392badc36b0f789398ec0b8d6b52e6391071c8..2645cfb5718b67a2376bdd4bcee6e88926c252df 100644 (file)
@@ -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)