[PATCH 1/3] mm: make mempool_alloc_from_pool() return bool

From: Eric Biggers

Date: Thu Aug 06 2026 - 18:19:17 EST


mempool_alloc_from_pool() is intentionally all-or-nothing, so make it
return a bool rather than the number of elements allocated.

Then make mempool_alloc_bulk() return right away if
mempool_alloc_from_pool() succeeds, rather than jumping back to the
retry_alloc label to allocate nothing and then returning.

Signed-off-by: Eric Biggers <ebiggers@xxxxxxxxxx>
---
mm/mempool.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/mm/mempool.c b/mm/mempool.c
index 473a029fa31f..d454bc9f39e9 100644
--- a/mm/mempool.c
+++ b/mm/mempool.c
@@ -409,7 +409,7 @@ int mempool_resize(struct mempool *pool, int new_min_nr)
}
EXPORT_SYMBOL(mempool_resize);

-static unsigned int mempool_alloc_from_pool(struct mempool *pool, void **elems,
+static bool mempool_alloc_from_pool(struct mempool *pool, void **elems,
unsigned int count, unsigned int allocated,
gfp_t gfp_mask)
{
@@ -432,7 +432,7 @@ static unsigned int mempool_alloc_from_pool(struct mempool *pool, void **elems,
*/
for (i = 0; i < count; i++)
kmemleak_update_trace(elems[i]);
- return allocated;
+ return true;

fail:
if (gfp_mask & __GFP_DIRECT_RECLAIM) {
@@ -454,7 +454,7 @@ static unsigned int mempool_alloc_from_pool(struct mempool *pool, void **elems,
spin_unlock_irqrestore(&pool->lock, flags);
}

- return allocated;
+ return false;
}

/*
@@ -519,8 +519,8 @@ int mempool_alloc_bulk_noprof(struct mempool *pool, void **elems,
return 0;

use_pool:
- allocated = mempool_alloc_from_pool(pool, elems, count, allocated,
- gfp_temp);
+ if (mempool_alloc_from_pool(pool, elems, count, allocated, gfp_temp))
+ return 0;
gfp_temp = gfp_mask;
goto repeat_alloc;
}
--
2.55.0