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); #include <linux/mm.h> 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"). Link: http://lkml.kernel.org/r/20180222020320.6944-1-hmclauchlan@fb.com Signed-off-by: Howard McLauchlan <hmclauchlan@fb.com> Reviewed-by: Andrew Morton <akpm@linux-foundation.org> Cc: Akinobu Mita <akinobu.mita@gmail.com> Cc: Christoph Lameter <cl@linux.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: David Rientjes <rientjes@google.com> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Josef Bacik <jbacik@fb.com> Cc: Johannes Weiner <jweiner@fb.com> Cc: Alexei Starovoitov <ast@fb.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
14298d3663
commit
4f6923fbb3
|
@ -64,10 +64,11 @@ static inline struct dentry *fault_create_debugfs_attr(const char *name,
|
||||||
|
|
||||||
struct kmem_cache;
|
struct kmem_cache;
|
||||||
|
|
||||||
|
int should_failslab(struct kmem_cache *s, gfp_t gfpflags);
|
||||||
#ifdef CONFIG_FAILSLAB
|
#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
|
#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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ static struct {
|
||||||
.cache_filter = false,
|
.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 */
|
/* No fault-injection for bootstrap cache */
|
||||||
if (unlikely(s == kmem_cache))
|
if (unlikely(s == kmem_cache))
|
||||||
|
|
|
@ -1516,3 +1516,11 @@ EXPORT_TRACEPOINT_SYMBOL(kmalloc_node);
|
||||||
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node);
|
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc_node);
|
||||||
EXPORT_TRACEPOINT_SYMBOL(kfree);
|
EXPORT_TRACEPOINT_SYMBOL(kfree);
|
||||||
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_free);
|
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);
|
||||||
|
|
Loading…
Reference in New Issue