diff options
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 29 |
1 files changed, 27 insertions, 2 deletions
@@ -151,7 +151,8 @@ | |||
151 | * Set of flags that will prevent slab merging | 151 | * Set of flags that will prevent slab merging |
152 | */ | 152 | */ |
153 | #define SLUB_NEVER_MERGE (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \ | 153 | #define SLUB_NEVER_MERGE (SLAB_RED_ZONE | SLAB_POISON | SLAB_STORE_USER | \ |
154 | SLAB_TRACE | SLAB_DESTROY_BY_RCU | SLAB_NOLEAKTRACE) | 154 | SLAB_TRACE | SLAB_DESTROY_BY_RCU | SLAB_NOLEAKTRACE | \ |
155 | SLAB_FAILSLAB) | ||
155 | 156 | ||
156 | #define SLUB_MERGE_SAME (SLAB_DEBUG_FREE | SLAB_RECLAIM_ACCOUNT | \ | 157 | #define SLUB_MERGE_SAME (SLAB_DEBUG_FREE | SLAB_RECLAIM_ACCOUNT | \ |
157 | SLAB_CACHE_DMA | SLAB_NOTRACK) | 158 | SLAB_CACHE_DMA | SLAB_NOTRACK) |
@@ -1004,6 +1005,9 @@ static int __init setup_slub_debug(char *str) | |||
1004 | case 't': | 1005 | case 't': |
1005 | slub_debug |= SLAB_TRACE; | 1006 | slub_debug |= SLAB_TRACE; |
1006 | break; | 1007 | break; |
1008 | case 'a': | ||
1009 | slub_debug |= SLAB_FAILSLAB; | ||
1010 | break; | ||
1007 | default: | 1011 | default: |
1008 | printk(KERN_ERR "slub_debug option '%c' " | 1012 | printk(KERN_ERR "slub_debug option '%c' " |
1009 | "unknown. skipped\n", *str); | 1013 | "unknown. skipped\n", *str); |
@@ -1700,7 +1704,7 @@ static __always_inline void *slab_alloc(struct kmem_cache *s, | |||
1700 | lockdep_trace_alloc(gfpflags); | 1704 | lockdep_trace_alloc(gfpflags); |
1701 | might_sleep_if(gfpflags & __GFP_WAIT); | 1705 | might_sleep_if(gfpflags & __GFP_WAIT); |
1702 | 1706 | ||
1703 | if (should_failslab(s->objsize, gfpflags)) | 1707 | if (should_failslab(s->objsize, gfpflags, s->flags)) |
1704 | return NULL; | 1708 | return NULL; |
1705 | 1709 | ||
1706 | local_irq_save(flags); | 1710 | local_irq_save(flags); |
@@ -4017,6 +4021,23 @@ static ssize_t trace_store(struct kmem_cache *s, const char *buf, | |||
4017 | } | 4021 | } |
4018 | SLAB_ATTR(trace); | 4022 | SLAB_ATTR(trace); |
4019 | 4023 | ||
4024 | #ifdef CONFIG_FAILSLAB | ||
4025 | static ssize_t failslab_show(struct kmem_cache *s, char *buf) | ||
4026 | { | ||
4027 | return sprintf(buf, "%d\n", !!(s->flags & SLAB_FAILSLAB)); | ||
4028 | } | ||
4029 | |||
4030 | static ssize_t failslab_store(struct kmem_cache *s, const char *buf, | ||
4031 | size_t length) | ||
4032 | { | ||
4033 | s->flags &= ~SLAB_FAILSLAB; | ||
4034 | if (buf[0] == '1') | ||
4035 | s->flags |= SLAB_FAILSLAB; | ||
4036 | return length; | ||
4037 | } | ||
4038 | SLAB_ATTR(failslab); | ||
4039 | #endif | ||
4040 | |||
4020 | static ssize_t reclaim_account_show(struct kmem_cache *s, char *buf) | 4041 | static ssize_t reclaim_account_show(struct kmem_cache *s, char *buf) |
4021 | { | 4042 | { |
4022 | return sprintf(buf, "%d\n", !!(s->flags & SLAB_RECLAIM_ACCOUNT)); | 4043 | return sprintf(buf, "%d\n", !!(s->flags & SLAB_RECLAIM_ACCOUNT)); |
@@ -4313,6 +4334,10 @@ static struct attribute *slab_attrs[] = { | |||
4313 | &deactivate_remote_frees_attr.attr, | 4334 | &deactivate_remote_frees_attr.attr, |
4314 | &order_fallback_attr.attr, | 4335 | &order_fallback_attr.attr, |
4315 | #endif | 4336 | #endif |
4337 | #ifdef CONFIG_FAILSLAB | ||
4338 | &failslab_attr.attr, | ||
4339 | #endif | ||
4340 | |||
4316 | NULL | 4341 | NULL |
4317 | }; | 4342 | }; |
4318 | 4343 | ||