aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/slub_def.h2
-rw-r--r--lib/Kconfig.debug2
-rw-r--r--mm/slub.c40
3 files changed, 37 insertions, 7 deletions
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
index b33c0f2e61dc..e4f5ed180b9b 100644
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -87,7 +87,7 @@ struct kmem_cache {
87 unsigned long min_partial; 87 unsigned long min_partial;
88 const char *name; /* Name (only for display!) */ 88 const char *name; /* Name (only for display!) */
89 struct list_head list; /* List of slab caches */ 89 struct list_head list; /* List of slab caches */
90#ifdef CONFIG_SLUB_DEBUG 90#ifdef CONFIG_SYSFS
91 struct kobject kobj; /* For sysfs */ 91 struct kobject kobj; /* For sysfs */
92#endif 92#endif
93 93
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 1b4afd2e6ca0..b6263651a955 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -353,7 +353,7 @@ config SLUB_DEBUG_ON
353config SLUB_STATS 353config SLUB_STATS
354 default n 354 default n
355 bool "Enable SLUB performance statistics" 355 bool "Enable SLUB performance statistics"
356 depends on SLUB && SLUB_DEBUG && SYSFS 356 depends on SLUB && SYSFS
357 help 357 help
358 SLUB statistics are useful to debug SLUBs allocation behavior in 358 SLUB statistics are useful to debug SLUBs allocation behavior in
359 order find ways to optimize the allocator. This should never be 359 order find ways to optimize the allocator. This should never be
diff --git a/mm/slub.c b/mm/slub.c
index a018019aa91d..be4d66231c6f 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -198,7 +198,7 @@ struct track {
198 198
199enum track_item { TRACK_ALLOC, TRACK_FREE }; 199enum track_item { TRACK_ALLOC, TRACK_FREE };
200 200
201#ifdef CONFIG_SLUB_DEBUG 201#ifdef CONFIG_SYSFS
202static int sysfs_slab_add(struct kmem_cache *); 202static int sysfs_slab_add(struct kmem_cache *);
203static int sysfs_slab_alias(struct kmem_cache *, const char *); 203static int sysfs_slab_alias(struct kmem_cache *, const char *);
204static void sysfs_slab_remove(struct kmem_cache *); 204static void sysfs_slab_remove(struct kmem_cache *);
@@ -1102,7 +1102,7 @@ static inline void slab_free_hook(struct kmem_cache *s, void *x) {}
1102static inline void slab_free_hook_irq(struct kmem_cache *s, 1102static inline void slab_free_hook_irq(struct kmem_cache *s,
1103 void *object) {} 1103 void *object) {}
1104 1104
1105#endif 1105#endif /* CONFIG_SLUB_DEBUG */
1106 1106
1107/* 1107/*
1108 * Slab allocation and freeing 1108 * Slab allocation and freeing
@@ -3373,7 +3373,7 @@ void *__kmalloc_node_track_caller(size_t size, gfp_t gfpflags,
3373} 3373}
3374#endif 3374#endif
3375 3375
3376#ifdef CONFIG_SLUB_DEBUG 3376#ifdef CONFIG_SYSFS
3377static int count_inuse(struct page *page) 3377static int count_inuse(struct page *page)
3378{ 3378{
3379 return page->inuse; 3379 return page->inuse;
@@ -3383,7 +3383,9 @@ static int count_total(struct page *page)
3383{ 3383{
3384 return page->objects; 3384 return page->objects;
3385} 3385}
3386#endif
3386 3387
3388#ifdef CONFIG_SLUB_DEBUG
3387static int validate_slab(struct kmem_cache *s, struct page *page, 3389static int validate_slab(struct kmem_cache *s, struct page *page,
3388 unsigned long *map) 3390 unsigned long *map)
3389{ 3391{
@@ -3474,6 +3476,7 @@ static long validate_slab_cache(struct kmem_cache *s)
3474 kfree(map); 3476 kfree(map);
3475 return count; 3477 return count;
3476} 3478}
3479#endif
3477 3480
3478#ifdef SLUB_RESILIENCY_TEST 3481#ifdef SLUB_RESILIENCY_TEST
3479static void resiliency_test(void) 3482static void resiliency_test(void)
@@ -3532,9 +3535,12 @@ static void resiliency_test(void)
3532 validate_slab_cache(kmalloc_caches[9]); 3535 validate_slab_cache(kmalloc_caches[9]);
3533} 3536}
3534#else 3537#else
3538#ifdef CONFIG_SYSFS
3535static void resiliency_test(void) {}; 3539static void resiliency_test(void) {};
3536#endif 3540#endif
3541#endif
3537 3542
3543#ifdef CONFIG_DEBUG
3538/* 3544/*
3539 * Generate lists of code addresses where slabcache objects are allocated 3545 * Generate lists of code addresses where slabcache objects are allocated
3540 * and freed. 3546 * and freed.
@@ -3763,7 +3769,9 @@ static int list_locations(struct kmem_cache *s, char *buf,
3763 len += sprintf(buf, "No data\n"); 3769 len += sprintf(buf, "No data\n");
3764 return len; 3770 return len;
3765} 3771}
3772#endif
3766 3773
3774#ifdef CONFIG_SYSFS
3767enum slab_stat_type { 3775enum slab_stat_type {
3768 SL_ALL, /* All slabs */ 3776 SL_ALL, /* All slabs */
3769 SL_PARTIAL, /* Only partially allocated slabs */ 3777 SL_PARTIAL, /* Only partially allocated slabs */
@@ -3816,6 +3824,8 @@ static ssize_t show_slab_objects(struct kmem_cache *s,
3816 } 3824 }
3817 } 3825 }
3818 3826
3827 down_read(&slub_lock);
3828#ifdef CONFIG_SLUB_DEBUG
3819 if (flags & SO_ALL) { 3829 if (flags & SO_ALL) {
3820 for_each_node_state(node, N_NORMAL_MEMORY) { 3830 for_each_node_state(node, N_NORMAL_MEMORY) {
3821 struct kmem_cache_node *n = get_node(s, node); 3831 struct kmem_cache_node *n = get_node(s, node);
@@ -3832,7 +3842,9 @@ static ssize_t show_slab_objects(struct kmem_cache *s,
3832 nodes[node] += x; 3842 nodes[node] += x;
3833 } 3843 }
3834 3844
3835 } else if (flags & SO_PARTIAL) { 3845 } else
3846#endif
3847 if (flags & SO_PARTIAL) {
3836 for_each_node_state(node, N_NORMAL_MEMORY) { 3848 for_each_node_state(node, N_NORMAL_MEMORY) {
3837 struct kmem_cache_node *n = get_node(s, node); 3849 struct kmem_cache_node *n = get_node(s, node);
3838 3850
@@ -3857,6 +3869,7 @@ static ssize_t show_slab_objects(struct kmem_cache *s,
3857 return x + sprintf(buf + x, "\n"); 3869 return x + sprintf(buf + x, "\n");
3858} 3870}
3859 3871
3872#ifdef CONFIG_SLUB_DEBUG
3860static int any_slab_objects(struct kmem_cache *s) 3873static int any_slab_objects(struct kmem_cache *s)
3861{ 3874{
3862 int node; 3875 int node;
@@ -3872,6 +3885,7 @@ static int any_slab_objects(struct kmem_cache *s)
3872 } 3885 }
3873 return 0; 3886 return 0;
3874} 3887}
3888#endif
3875 3889
3876#define to_slab_attr(n) container_of(n, struct slab_attribute, attr) 3890#define to_slab_attr(n) container_of(n, struct slab_attribute, attr)
3877#define to_slab(n) container_of(n, struct kmem_cache, kobj); 3891#define to_slab(n) container_of(n, struct kmem_cache, kobj);
@@ -3973,11 +3987,13 @@ static ssize_t aliases_show(struct kmem_cache *s, char *buf)
3973} 3987}
3974SLAB_ATTR_RO(aliases); 3988SLAB_ATTR_RO(aliases);
3975 3989
3990#ifdef CONFIG_SLUB_DEBUG
3976static ssize_t slabs_show(struct kmem_cache *s, char *buf) 3991static ssize_t slabs_show(struct kmem_cache *s, char *buf)
3977{ 3992{
3978 return show_slab_objects(s, buf, SO_ALL); 3993 return show_slab_objects(s, buf, SO_ALL);
3979} 3994}
3980SLAB_ATTR_RO(slabs); 3995SLAB_ATTR_RO(slabs);
3996#endif
3981 3997
3982static ssize_t partial_show(struct kmem_cache *s, char *buf) 3998static ssize_t partial_show(struct kmem_cache *s, char *buf)
3983{ 3999{
@@ -4003,6 +4019,7 @@ static ssize_t objects_partial_show(struct kmem_cache *s, char *buf)
4003} 4019}
4004SLAB_ATTR_RO(objects_partial); 4020SLAB_ATTR_RO(objects_partial);
4005 4021
4022#ifdef CONFIG_SLUB_DEBUG
4006static ssize_t total_objects_show(struct kmem_cache *s, char *buf) 4023static ssize_t total_objects_show(struct kmem_cache *s, char *buf)
4007{ 4024{
4008 return show_slab_objects(s, buf, SO_ALL|SO_TOTAL); 4025 return show_slab_objects(s, buf, SO_ALL|SO_TOTAL);
@@ -4055,6 +4072,7 @@ static ssize_t failslab_store(struct kmem_cache *s, const char *buf,
4055} 4072}
4056SLAB_ATTR(failslab); 4073SLAB_ATTR(failslab);
4057#endif 4074#endif
4075#endif
4058 4076
4059static ssize_t reclaim_account_show(struct kmem_cache *s, char *buf) 4077static ssize_t reclaim_account_show(struct kmem_cache *s, char *buf)
4060{ 4078{
@@ -4091,6 +4109,7 @@ static ssize_t destroy_by_rcu_show(struct kmem_cache *s, char *buf)
4091} 4109}
4092SLAB_ATTR_RO(destroy_by_rcu); 4110SLAB_ATTR_RO(destroy_by_rcu);
4093 4111
4112#ifdef CONFIG_SLUB_DEBUG
4094static ssize_t red_zone_show(struct kmem_cache *s, char *buf) 4113static ssize_t red_zone_show(struct kmem_cache *s, char *buf)
4095{ 4114{
4096 return sprintf(buf, "%d\n", !!(s->flags & SLAB_RED_ZONE)); 4115 return sprintf(buf, "%d\n", !!(s->flags & SLAB_RED_ZONE));
@@ -4166,6 +4185,7 @@ static ssize_t validate_store(struct kmem_cache *s,
4166 return ret; 4185 return ret;
4167} 4186}
4168SLAB_ATTR(validate); 4187SLAB_ATTR(validate);
4188#endif
4169 4189
4170static ssize_t shrink_show(struct kmem_cache *s, char *buf) 4190static ssize_t shrink_show(struct kmem_cache *s, char *buf)
4171{ 4191{
@@ -4186,6 +4206,7 @@ static ssize_t shrink_store(struct kmem_cache *s,
4186} 4206}
4187SLAB_ATTR(shrink); 4207SLAB_ATTR(shrink);
4188 4208
4209#ifdef CONFIG_SLUB_DEBUG
4189static ssize_t alloc_calls_show(struct kmem_cache *s, char *buf) 4210static ssize_t alloc_calls_show(struct kmem_cache *s, char *buf)
4190{ 4211{
4191 if (!(s->flags & SLAB_STORE_USER)) 4212 if (!(s->flags & SLAB_STORE_USER))
@@ -4201,6 +4222,7 @@ static ssize_t free_calls_show(struct kmem_cache *s, char *buf)
4201 return list_locations(s, buf, TRACK_FREE); 4222 return list_locations(s, buf, TRACK_FREE);
4202} 4223}
4203SLAB_ATTR_RO(free_calls); 4224SLAB_ATTR_RO(free_calls);
4225#endif
4204 4226
4205#ifdef CONFIG_NUMA 4227#ifdef CONFIG_NUMA
4206static ssize_t remote_node_defrag_ratio_show(struct kmem_cache *s, char *buf) 4228static ssize_t remote_node_defrag_ratio_show(struct kmem_cache *s, char *buf)
@@ -4307,25 +4329,33 @@ static struct attribute *slab_attrs[] = {
4307 &min_partial_attr.attr, 4329 &min_partial_attr.attr,
4308 &objects_attr.attr, 4330 &objects_attr.attr,
4309 &objects_partial_attr.attr, 4331 &objects_partial_attr.attr,
4332#ifdef CONFIG_SLUB_DEBUG
4310 &total_objects_attr.attr, 4333 &total_objects_attr.attr,
4311 &slabs_attr.attr, 4334 &slabs_attr.attr,
4335#endif
4312 &partial_attr.attr, 4336 &partial_attr.attr,
4313 &cpu_slabs_attr.attr, 4337 &cpu_slabs_attr.attr,
4314 &ctor_attr.attr, 4338 &ctor_attr.attr,
4315 &aliases_attr.attr, 4339 &aliases_attr.attr,
4316 &align_attr.attr, 4340 &align_attr.attr,
4341#ifdef CONFIG_SLUB_DEBUG
4317 &sanity_checks_attr.attr, 4342 &sanity_checks_attr.attr,
4318 &trace_attr.attr, 4343 &trace_attr.attr,
4344#endif
4319 &hwcache_align_attr.attr, 4345 &hwcache_align_attr.attr,
4320 &reclaim_account_attr.attr, 4346 &reclaim_account_attr.attr,
4321 &destroy_by_rcu_attr.attr, 4347 &destroy_by_rcu_attr.attr,
4348#ifdef CONFIG_SLUB_DEBUG
4322 &red_zone_attr.attr, 4349 &red_zone_attr.attr,
4323 &poison_attr.attr, 4350 &poison_attr.attr,
4324 &store_user_attr.attr, 4351 &store_user_attr.attr,
4325 &validate_attr.attr, 4352 &validate_attr.attr,
4353#endif
4326 &shrink_attr.attr, 4354 &shrink_attr.attr,
4355#ifdef CONFIG_SLUB_DEBUG
4327 &alloc_calls_attr.attr, 4356 &alloc_calls_attr.attr,
4328 &free_calls_attr.attr, 4357 &free_calls_attr.attr,
4358#endif
4329#ifdef CONFIG_ZONE_DMA 4359#ifdef CONFIG_ZONE_DMA
4330 &cache_dma_attr.attr, 4360 &cache_dma_attr.attr,
4331#endif 4361#endif
@@ -4608,7 +4638,7 @@ static int __init slab_sysfs_init(void)
4608} 4638}
4609 4639
4610__initcall(slab_sysfs_init); 4640__initcall(slab_sysfs_init);
4611#endif 4641#endif /* CONFIG_SYSFS */
4612 4642
4613/* 4643/*
4614 * The /proc/slabinfo ABI 4644 * The /proc/slabinfo ABI