Messages in this thread Patch in this message | | | Date | Thu, 31 Aug 2006 19:07:58 +0900 | From | Akinobu Mita <> | Subject | [patch 2/6] fault-injection capability for kmalloc. |
| |
This patch provides fault-injection capability for kmalloc.
Boot option:
failslab=<probability>,<interval>,<times>,<space>
<probability>
specifies how often it should fail in percent.
<interval>
specifies the interval of failures.
<times>
specifies how many times failures may happen at most.
<space>
specifies the size of free space where memory can be allocated safely in bytes.
Example:
failslab=100,10,-1,0
slab allocation (kmalloc, kmem_cache_alloc,..) fails once per 10 times.
Cc: Pekka Enberg <penberg@cs.helsinki.fi> Signed-off-by: Akinobu Mita <mita@miraclelinux.com>
include/linux/should_fail.h | 4 ++++ lib/Kconfig.debug | 7 +++++++ mm/slab.c | 21 +++++++++++++++++++++ 3 files changed, 32 insertions(+)
Index: work-shouldfail/mm/slab.c =================================================================== --- work-shouldfail.orig/mm/slab.c +++ work-shouldfail/mm/slab.c @@ -108,6 +108,7 @@ #include <linux/mempolicy.h> #include <linux/mutex.h> #include <linux/rtmutex.h> +#include <linux/should_fail.h> #include <asm/uaccess.h> #include <asm/cacheflush.h> @@ -2963,11 +2964,31 @@ static void *cache_alloc_debugcheck_afte #define cache_alloc_debugcheck_after(a,b,objp,d) (objp) #endif +#ifdef CONFIG_FAILSLAB + +static DEFINE_SHOULD_FAIL(failslab_data); + +static int __init setup_failslab(char *str) +{ + should_fail_srandom(jiffies); + return setup_should_fail(&failslab_data, str); +} +__setup("failslab=", setup_failslab); + +struct should_fail_data *failslab = &failslab_data; +EXPORT_SYMBOL_GPL(failslab); + +#endif + static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags) { void *objp; struct array_cache *ac; + if (!(flags & __GFP_NOFAIL) && cachep != &cache_cache && + should_fail(failslab, obj_size(cachep))) + 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 SHOULD_FAIL bool +config FAILSLAB + bool "fault-injection capabilitiy for kmalloc" + depends on DEBUG_KERNEL + select SHOULD_FAIL + help + This option provides fault-injection capabilitiy for kmalloc. + Index: work-shouldfail/include/linux/should_fail.h =================================================================== --- work-shouldfail.orig/include/linux/should_fail.h +++ work-shouldfail/include/linux/should_fail.h @@ -36,6 +36,10 @@ int setup_should_fail(struct should_fail void should_fail_srandom(unsigned long entropy); int should_fail(struct should_fail_data *data, ssize_t size); +#ifdef CONFIG_FAILSLAB +extern struct should_fail_data *failslab; +#endif + #else #define should_fail(data, size) (0) -- - 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/
| |