On 10/31/25 10:34, Christoph Hellwig wrote:
> Add a call to should_fail_ex that forces mempool to actually allocate
> from the pool to stress the mempool implementation when enabled through
> debugfs.  By default should_fail{,_ex} prints a very verbose stack trace
> that clutters the kernel log, slows down execution and triggers the
> kernel bug detection in xfstests.  Pass FAULT_NOWARN and print a
> single-line message notating the caller instead so that full tests
> can be run with fault injection.
> 
> Signed-off-by: Christoph Hellwig <[email protected]>

Acked-by: Vlastimil Babka <[email protected]>

> ---
>  mm/mempool.c | 24 +++++++++++++++++++-----
>  1 file changed, 19 insertions(+), 5 deletions(-)
> 
> diff --git a/mm/mempool.c b/mm/mempool.c
> index d7c55a98c2be..15581179c8b9 100644
> --- a/mm/mempool.c
> +++ b/mm/mempool.c
> @@ -9,7 +9,7 @@
>   *  started by Ingo Molnar, Copyright (C) 2001
>   *  debugging by David Rientjes, Copyright (C) 2015
>   */
> -
> +#include <linux/fault-inject.h>
>  #include <linux/mm.h>
>  #include <linux/slab.h>
>  #include <linux/highmem.h>
> @@ -20,6 +20,15 @@
>  #include <linux/writeback.h>
>  #include "slab.h"
>  
> +static DECLARE_FAULT_ATTR(fail_mempool_alloc);
> +
> +static int __init mempool_faul_inject_init(void)
> +{
> +     return PTR_ERR_OR_ZERO(fault_create_debugfs_attr("fail_mempool_alloc",
> +                     NULL, &fail_mempool_alloc));
> +}
> +late_initcall(mempool_faul_inject_init);
> +
>  #ifdef CONFIG_SLUB_DEBUG_ON
>  static void poison_error(mempool_t *pool, void *element, size_t size,
>                        size_t byte)
> @@ -399,10 +408,15 @@ void *mempool_alloc_noprof(mempool_t *pool, gfp_t 
> gfp_mask)
>       gfp_temp = gfp_mask & ~(__GFP_DIRECT_RECLAIM|__GFP_IO);
>  
>  repeat_alloc:
> -
> -     element = pool->alloc(gfp_temp, pool->pool_data);
> -     if (likely(element != NULL))
> -             return element;
> +     if (should_fail_ex(&fail_mempool_alloc, 1, FAULT_NOWARN)) {
> +             pr_info("forcing mempool usage for pool %pS\n",
> +                             (void *)_RET_IP_);
> +             element = NULL;
> +     } else {
> +             element = pool->alloc(gfp_temp, pool->pool_data);
> +             if (likely(element != NULL))
> +                     return element;
> +     }
>  
>       spin_lock_irqsave(&pool->lock, flags);
>       if (likely(pool->curr_nr)) {


Reply via email to