]> Gentwo Git Trees - linux/.git/commitdiff
mempool: add error injection support
authorChristoph Hellwig <hch@lst.de>
Thu, 13 Nov 2025 08:39:45 +0000 (09:39 +0100)
committerVlastimil Babka <vbabka@suse.cz>
Thu, 13 Nov 2025 16:10:38 +0000 (17:10 +0100)
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 <hch@lst.de>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Link: https://patch.msgid.link/20251113084022.1255121-5-hch@lst.de
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
mm/mempool.c

index 1f47017132036675d709d7ef4a9996dd1297227e..5cf59779cc3d3901e1c3c2de9610f7c925a92e28 100644 (file)
@@ -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>
 #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)
@@ -404,9 +413,15 @@ void *mempool_alloc_noprof(mempool_t *pool, gfp_t gfp_mask)
        gfp_temp = gfp_mask & ~(__GFP_DIRECT_RECLAIM|__GFP_IO);
 
 repeat_alloc:
+       if (should_fail_ex(&fail_mempool_alloc, 1, FAULT_NOWARN)) {
+               pr_info("forcing mempool usage for %pS\n",
+                               (void *)_RET_IP_);
+               element = NULL;
+       } else {
+               element = pool->alloc(gfp_temp, pool->pool_data);
+       }
 
-       element = pool->alloc(gfp_temp, pool->pool_data);
-       if (likely(element != NULL))
+       if (likely(element))
                return element;
 
        spin_lock_irqsave(&pool->lock, flags);