linux/mm/failslab.c
<<
>>
Prefs
   1#include <linux/fault-inject.h>
   2#include <linux/slab.h>
   3
   4static struct {
   5        struct fault_attr attr;
   6        u32 ignore_gfp_wait;
   7        int cache_filter;
   8} failslab = {
   9        .attr = FAULT_ATTR_INITIALIZER,
  10        .ignore_gfp_wait = 1,
  11        .cache_filter = 0,
  12};
  13
  14bool should_failslab(size_t size, gfp_t gfpflags, unsigned long cache_flags)
  15{
  16        if (gfpflags & __GFP_NOFAIL)
  17                return false;
  18
  19        if (failslab.ignore_gfp_wait && (gfpflags & __GFP_WAIT))
  20                return false;
  21
  22        if (failslab.cache_filter && !(cache_flags & SLAB_FAILSLAB))
  23                return false;
  24
  25        return should_fail(&failslab.attr, size);
  26}
  27
  28static int __init setup_failslab(char *str)
  29{
  30        return setup_fault_attr(&failslab.attr, str);
  31}
  32__setup("failslab=", setup_failslab);
  33
  34#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
  35static int __init failslab_debugfs_init(void)
  36{
  37        struct dentry *dir;
  38        umode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
  39
  40        dir = fault_create_debugfs_attr("failslab", NULL, &failslab.attr);
  41        if (IS_ERR(dir))
  42                return PTR_ERR(dir);
  43
  44        if (!debugfs_create_bool("ignore-gfp-wait", mode, dir,
  45                                &failslab.ignore_gfp_wait))
  46                goto fail;
  47        if (!debugfs_create_bool("cache-filter", mode, dir,
  48                                &failslab.cache_filter))
  49                goto fail;
  50
  51        return 0;
  52fail:
  53        debugfs_remove_recursive(dir);
  54
  55        return -ENOMEM;
  56}
  57
  58late_initcall(failslab_debugfs_init);
  59
  60#endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */
  61