This patch provides fault-injection capability for kmalloc. Boot option: failslab=,,, -- specifies the interval of failures. -- specifies how often it should fail in percent. -- specifies the size of free space where memory can be allocated safely in bytes. -- specifies how many times failures may happen at most. Example: failslab=10,100,0,-1 slab allocation (kmalloc(), kmem_cache_alloc(),..) fails once per 10 times. Cc: Pekka Enberg Signed-off-by: Akinobu Mita include/linux/fault-inject.h | 4 ++++ lib/Kconfig.debug | 7 +++++++ mm/slab.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) Index: work-shouldfail/mm/slab.c =================================================================== --- work-shouldfail.orig/mm/slab.c +++ work-shouldfail/mm/slab.c @@ -108,6 +108,7 @@ #include #include #include +#include #include #include @@ -2963,11 +2964,44 @@ static void *cache_alloc_debugcheck_afte #define cache_alloc_debugcheck_after(a,b,objp,d) (objp) #endif +#ifdef CONFIG_FAILSLAB + +static DEFINE_FAULT_ATTR(failslab_attr); + +static int __init setup_failslab(char *str) +{ + should_fail_srandom(jiffies); + return setup_fault_attr(&failslab_attr, str); +} +__setup("failslab=", setup_failslab); + +struct fault_attr *failslab = &failslab_attr; +EXPORT_SYMBOL_GPL(failslab); + +static int should_failslab(struct kmem_cache *cachep, gfp_t flags) +{ + if ((flags & __GFP_NOFAIL) || cachep == &cache_cache) + return 0; + return should_fail(failslab, obj_size(cachep)); +} + +#else + +static inline int should_failslab(struct kmem_cache *cachep, gfp_t flags) +{ + return 0; +} + +#endif + static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags) { void *objp; struct array_cache *ac; + if (should_failslab(cachep, flags)) + return NULL; + #ifdef CONFIG_NUMA if (unlikely(current->flags & (PF_SPREAD_SLAB | PF_MEMPOLICY))) { objp = alternate_node_alloc(cachep, flags); Index: work-shouldfail/lib/Kconfig.debug =================================================================== --- work-shouldfail.orig/lib/Kconfig.debug +++ work-shouldfail/lib/Kconfig.debug @@ -372,3 +372,10 @@ config RCU_TORTURE_TEST config FAULT_INJECTION bool +config FAILSLAB + bool "fault-injection capabilitiy for kmalloc" + depends on DEBUG_KERNEL + select FAULT_INJECTION + help + This option provides fault-injection capabilitiy for kmalloc. + Index: work-shouldfail/include/linux/fault-inject.h =================================================================== --- work-shouldfail.orig/include/linux/fault-inject.h +++ work-shouldfail/include/linux/fault-inject.h @@ -36,6 +36,10 @@ int setup_fault_attr(struct fault_attr * void should_fail_srandom(unsigned long entropy); int should_fail(struct fault_attr *attr, ssize_t size); +#ifdef CONFIG_FAILSLAB +extern struct fault_attr *failslab; +#endif + #endif /* CONFIG_FAULT_INJECTION */ #endif /* _LINUX_FAULT_INJECT_H */ -- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/