mm: make should_failslab always available for fault injection
Subsystems (2)
PATCH 1/1 mm: make should_failslab always available for fault injection
should_failslab() is a convenient function to hook into for directed error injection into kmalloc(). However, it is only available if a config flag is set.
The following BCC script, for example, fails kmalloc() calls after a btrfs umount:
from bcc import BPF
prog = r"""BPF_HASH(flag);
int kprobe__btrfs_close_devices(void *ctx) {
u64 key = 1;
flag.update(&key, &key);
return 0;
}int kprobe__should_failslab(struct pt_regs *ctx) {
u64 key = 1;
u64 *res;
res = flag.lookup(&key);
if (res != 0) {
bpf_override_return(ctx, -ENOMEM);
}
return 0;
}"""
b = BPF(text=prog)
while 1:
b.kprobe_poll()
This patch refactors the should_failslab implementation so that the function is always available for error injection, independent of flags.
This change would be similar in nature to commit f5490d3ec921 ("block:
Add should_fail_bio() for bpf error injection").
--- include/linux/fault-inject.h | 5 +++-- mm/failslab.c | 2 +- mm/slab_common.c | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-)
include/linux/fault-inject.h +3 -2
@@ -64,10 +64,11 @@ static inline struct dentry *fault_create_debugfs_attr(const char *name,struct kmem_cache ; +int should_failslab (struct kmem_cache *s,gfp_t gfpflags);#ifdef CONFIG_FAILSLAB -extern bool should_failslab (struct kmem_cache *s,gfp_t gfpflags); +extern bool __should_failslab (struct kmem_cache *s,gfp_t gfpflags);#else -static inline bool should_failslab (struct kmem_cache *s,gfp_t gfpflags) +static inline bool __should_failslab (struct kmem_cache *s,gfp_t gfpflags) {return false; }
mm/failslab.c +1 -1
@@ -14,7 +14,7 @@ static struct { .cache_filter = false, }; -bool should_failslab (struct kmem_cache *s,gfp_t gfpflags) +bool __should_failslab (struct kmem_cache *s,gfp_t gfpflags) {/* No fault-injection for bootstrap cache */ if (unlikely (s == kmem_cache))
mm/slab_common.c +8 -0
@@ -1532,3 +1532,11 @@ EXPORT_TRACEPOINT_SYMBOL(kmalloc_node);EXPORT_TRACEPOINT_SYMBOL (kmem_cache_alloc_node);EXPORT_TRACEPOINT_SYMBOL (kfree);EXPORT_TRACEPOINT_SYMBOL (kmem_cache_free); + +int should_failslab (struct kmem_cache *s,gfp_t gfpflags) +{ +if (__should_failslab (s, gfpflags)) +return -ENOMEM ; +return 0 ; +} +ALLOW_ERROR_INJECTION (should_failslab,ERRNO );
Signature · 7 lines
2.14.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 84 lines · Howard McLauchlan
should_failslab()is a convenient function to hook into for directed error injection intokmalloc(). However, it is only available if a config flag is set.The following BCC script, for example, fails
kmalloc()calls after a btrfs umount:from bcc import BPF
prog = r"""
BPF_HASH(flag);int kprobe__btrfs_close_devices(void *ctx) { u64 key = 1; flag.update(&key, &key); return 0; }int kprobe__should_failslab(struct pt_regs *ctx) { u64 key = 1; u64 *res; res = flag.lookup(&key); if (res != 0) { bpf_override_return(ctx, -ENOMEM); } return 0; }"""
b = BPF(text=prog)while 1:
b.kprobe_poll()This patch refactors the
should_failslabimplementation so that the function is always available for error injection, independent of flags.This change would be similar in nature to commit
f5490d3ec921("block:
Addshould_fail_bio()for bpf error injection").Signed-off-by Howard McLauchlan <[email protected]>--- include/linux/fault-inject.h | 5 +++-- mm/failslab.c | 2 +- mm/slab_common.c | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-)include/linux/fault-inject.h +3
-2@@ -64,10 +64,11 @@ static inline struct dentry *fault_create_debugfs_attr(const char *name,struct kmem_cache ; +int should_failslab (struct kmem_cache *s,gfp_t gfpflags);#ifdef CONFIG_FAILSLAB -extern bool should_failslab (struct kmem_cache *s,gfp_t gfpflags); +extern bool __should_failslab (struct kmem_cache *s,gfp_t gfpflags);#else -static inline bool should_failslab (struct kmem_cache *s,gfp_t gfpflags) +static inline bool __should_failslab (struct kmem_cache *s,gfp_t gfpflags) {return false; }mm/failslab.c +1
-1@@ -14,7 +14,7 @@ static struct { .cache_filter = false, }; -bool should_failslab (struct kmem_cache *s,gfp_t gfpflags) +bool __should_failslab (struct kmem_cache *s,gfp_t gfpflags) {/* No fault-injection for bootstrap cache */ if (unlikely (s == kmem_cache))mm/slab_common.c +0
-0@@ -1532,3 +1532,11 @@ EXPORT_TRACEPOINT_SYMBOL(kmalloc_node);EXPORT_TRACEPOINT_SYMBOL (kmem_cache_alloc_node);
mm/slab_common.c EXPORT_TRACEPOINT_SYMBOL(kmalloc_node); · line 1542
Quoted 10 lines
mm/slab_common.c +8
-0EXPORT_TRACEPOINT_SYMBOL (kfree);EXPORT_TRACEPOINT_SYMBOL (kmem_cache_free); + +int should_failslab (struct kmem_cache *s,gfp_t gfpflags) +{ +if (__should_failslab (s, gfpflags)) +return -ENOMEM ; +return 0 ; +} +ALLOW_ERROR_INJECTION (should_failslab,ERRNO );
The script is missing a '#include <linux/mm.h>' on the first line of the C program text.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>