mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
failslab: add ability to filter slab caches
This patch allow to inject faults only for specific slabs. In order to preserve default behavior cache filter is off by default (all caches are faulty). One may define specific set of slabs like this: # mark skbuff_head_cache as faulty echo 1 > /sys/kernel/slab/skbuff_head_cache/failslab # Turn on cache filter (off by default) echo 1 > /sys/kernel/debug/failslab/cache-filter # Turn on fault injection echo 1 > /sys/kernel/debug/failslab/times echo 1 > /sys/kernel/debug/failslab/probability Acked-by: David Rientjes <[email protected]> Acked-by: Akinobu Mita <[email protected]> Acked-by: Christoph Lameter <[email protected]> Signed-off-by: Dmitry Monakhov <[email protected]> Signed-off-by: Pekka Enberg <[email protected]>
This commit is contained in:
parent
60b341b778
commit
4c13dd3b48
6 changed files with 52 additions and 8 deletions
29
mm/slub.c
29
mm/slub.c
|
|
@ -151,7 +151,8 @@
|
|||
* Set of flags that will prevent slab merging
|
||||
*/
|
||||
#define SLUB_NEVER_MERGE (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \
|
||||
SLAB_TRACE | SLAB_DESTROY_BY_RCU | SLAB_NOLEAKTRACE)
|
||||
SLAB_TRACE | SLAB_DESTROY_BY_RCU | SLAB_NOLEAKTRACE | \
|
||||
SLAB_FAILSLAB)
|
||||
|
||||
#define SLUB_MERGE_SAME (SLAB_DEBUG_FREE | SLAB_RECLAIM_ACCOUNT | \
|
||||
SLAB_CACHE_DMA | SLAB_NOTRACK)
|
||||
|
|
@ -1020,6 +1021,9 @@ static int __init setup_slub_debug(char *str)
|
|||
case 't':
|
||||
slub_debug |= SLAB_TRACE;
|
||||
break;
|
||||
case 'a':
|
||||
slub_debug |= SLAB_FAILSLAB;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "slub_debug option '%c' "
|
||||
"unknown. skipped\n", *str);
|
||||
|
|
@ -1718,7 +1722,7 @@ static __always_inline void *slab_alloc(struct kmem_cache *s,
|
|||
lockdep_trace_alloc(gfpflags);
|
||||
might_sleep_if(gfpflags & __GFP_WAIT);
|
||||
|
||||
if (should_failslab(s->objsize, gfpflags))
|
||||
if (should_failslab(s->objsize, gfpflags, s->flags))
|
||||
return NULL;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
|
@ -4171,6 +4175,23 @@ static ssize_t trace_store(struct kmem_cache *s, const char *buf,
|
|||
}
|
||||
SLAB_ATTR(trace);
|
||||
|
||||
#ifdef CONFIG_FAILSLAB
|
||||
static ssize_t failslab_show(struct kmem_cache *s, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d\n", !!(s->flags & SLAB_FAILSLAB));
|
||||
}
|
||||
|
||||
static ssize_t failslab_store(struct kmem_cache *s, const char *buf,
|
||||
size_t length)
|
||||
{
|
||||
s->flags &= ~SLAB_FAILSLAB;
|
||||
if (buf[0] == '1')
|
||||
s->flags |= SLAB_FAILSLAB;
|
||||
return length;
|
||||
}
|
||||
SLAB_ATTR(failslab);
|
||||
#endif
|
||||
|
||||
static ssize_t reclaim_account_show(struct kmem_cache *s, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d\n", !!(s->flags & SLAB_RECLAIM_ACCOUNT));
|
||||
|
|
@ -4467,6 +4488,10 @@ static struct attribute *slab_attrs[] = {
|
|||
&deactivate_remote_frees_attr.attr,
|
||||
&order_fallback_attr.attr,
|
||||
#endif
|
||||
#ifdef CONFIG_FAILSLAB
|
||||
&failslab_attr.attr,
|
||||
#endif
|
||||
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue