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:
Родитель
14298d3663
Коммит
4f6923fbb3
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -1516,3 +1516,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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче