mirror of https://github.com/torvalds/linux.git
mempool: add error injection support
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>
This commit is contained in:
parent
5c829783e5
commit
b77fc08e39
21
mm/mempool.c
21
mm/mempool.c
|
|
@ -9,7 +9,7 @@
|
||||||
* started by Ingo Molnar, Copyright (C) 2001
|
* started by Ingo Molnar, Copyright (C) 2001
|
||||||
* debugging by David Rientjes, Copyright (C) 2015
|
* debugging by David Rientjes, Copyright (C) 2015
|
||||||
*/
|
*/
|
||||||
|
#include <linux/fault-inject.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
|
|
@ -20,6 +20,15 @@
|
||||||
#include <linux/writeback.h>
|
#include <linux/writeback.h>
|
||||||
#include "slab.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
|
#ifdef CONFIG_SLUB_DEBUG_ON
|
||||||
static void poison_error(mempool_t *pool, void *element, size_t size,
|
static void poison_error(mempool_t *pool, void *element, size_t size,
|
||||||
size_t byte)
|
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);
|
gfp_temp = gfp_mask & ~(__GFP_DIRECT_RECLAIM|__GFP_IO);
|
||||||
|
|
||||||
repeat_alloc:
|
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;
|
return element;
|
||||||
|
|
||||||
spin_lock_irqsave(&pool->lock, flags);
|
spin_lock_irqsave(&pool->lock, flags);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue