diff options
| author | Tejun Heo <tj@kernel.org> | 2017-02-22 18:41:11 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-02-22 19:41:27 -0500 |
| commit | bf5eb3de3847ebcfd1fea7bc14072ef9f21d4e8d (patch) | |
| tree | 7e03f1c29075716c9e5cdef6803d9a0de6e80263 | |
| parent | 290b6a58b78be709e734d7fbeb1aa0416d9d41bc (diff) | |
slub: separate out sysfs_slab_release() from sysfs_slab_remove()
Separate out slub sysfs removal and release, and call the former earlier
from __kmem_cache_shutdown(). There's no reason to defer sysfs removal
through RCU and this will later allow us to remove sysfs files way
earlier during memory cgroup offline instead of release.
Link: http://lkml.kernel.org/r/20170117235411.9408-3-tj@kernel.org
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Vladimir Davydov <vdavydov.dev@gmail.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | include/linux/slub_def.h | 4 | ||||
| -rw-r--r-- | mm/slab_common.c | 2 | ||||
| -rw-r--r-- | mm/slub.c | 12 |
3 files changed, 13 insertions, 5 deletions
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index 75f56c2ef2d4..07ef550c6627 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
| @@ -113,9 +113,9 @@ struct kmem_cache { | |||
| 113 | 113 | ||
| 114 | #ifdef CONFIG_SYSFS | 114 | #ifdef CONFIG_SYSFS |
| 115 | #define SLAB_SUPPORTS_SYSFS | 115 | #define SLAB_SUPPORTS_SYSFS |
| 116 | void sysfs_slab_remove(struct kmem_cache *); | 116 | void sysfs_slab_release(struct kmem_cache *); |
| 117 | #else | 117 | #else |
| 118 | static inline void sysfs_slab_remove(struct kmem_cache *s) | 118 | static inline void sysfs_slab_release(struct kmem_cache *s) |
| 119 | { | 119 | { |
| 120 | } | 120 | } |
| 121 | #endif | 121 | #endif |
diff --git a/mm/slab_common.c b/mm/slab_common.c index 4a999d749d2b..e6311b2dbba6 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c | |||
| @@ -483,7 +483,7 @@ static void release_caches(struct list_head *release, bool need_rcu_barrier) | |||
| 483 | 483 | ||
| 484 | list_for_each_entry_safe(s, s2, release, list) { | 484 | list_for_each_entry_safe(s, s2, release, list) { |
| 485 | #ifdef SLAB_SUPPORTS_SYSFS | 485 | #ifdef SLAB_SUPPORTS_SYSFS |
| 486 | sysfs_slab_remove(s); | 486 | sysfs_slab_release(s); |
| 487 | #else | 487 | #else |
| 488 | slab_kmem_cache_release(s); | 488 | slab_kmem_cache_release(s); |
| 489 | #endif | 489 | #endif |
| @@ -214,11 +214,13 @@ enum track_item { TRACK_ALLOC, TRACK_FREE }; | |||
| 214 | static int sysfs_slab_add(struct kmem_cache *); | 214 | static int sysfs_slab_add(struct kmem_cache *); |
| 215 | static int sysfs_slab_alias(struct kmem_cache *, const char *); | 215 | static int sysfs_slab_alias(struct kmem_cache *, const char *); |
| 216 | static void memcg_propagate_slab_attrs(struct kmem_cache *s); | 216 | static void memcg_propagate_slab_attrs(struct kmem_cache *s); |
| 217 | static void sysfs_slab_remove(struct kmem_cache *s); | ||
| 217 | #else | 218 | #else |
| 218 | static inline int sysfs_slab_add(struct kmem_cache *s) { return 0; } | 219 | static inline int sysfs_slab_add(struct kmem_cache *s) { return 0; } |
| 219 | static inline int sysfs_slab_alias(struct kmem_cache *s, const char *p) | 220 | static inline int sysfs_slab_alias(struct kmem_cache *s, const char *p) |
| 220 | { return 0; } | 221 | { return 0; } |
| 221 | static inline void memcg_propagate_slab_attrs(struct kmem_cache *s) { } | 222 | static inline void memcg_propagate_slab_attrs(struct kmem_cache *s) { } |
| 223 | static inline void sysfs_slab_remove(struct kmem_cache *s) { } | ||
| 222 | #endif | 224 | #endif |
| 223 | 225 | ||
| 224 | static inline void stat(const struct kmem_cache *s, enum stat_item si) | 226 | static inline void stat(const struct kmem_cache *s, enum stat_item si) |
| @@ -3687,6 +3689,7 @@ int __kmem_cache_shutdown(struct kmem_cache *s) | |||
| 3687 | if (n->nr_partial || slabs_node(s, node)) | 3689 | if (n->nr_partial || slabs_node(s, node)) |
| 3688 | return 1; | 3690 | return 1; |
| 3689 | } | 3691 | } |
| 3692 | sysfs_slab_remove(s); | ||
| 3690 | return 0; | 3693 | return 0; |
| 3691 | } | 3694 | } |
| 3692 | 3695 | ||
| @@ -5637,7 +5640,7 @@ out_del_kobj: | |||
| 5637 | goto out; | 5640 | goto out; |
| 5638 | } | 5641 | } |
| 5639 | 5642 | ||
| 5640 | void sysfs_slab_remove(struct kmem_cache *s) | 5643 | static void sysfs_slab_remove(struct kmem_cache *s) |
| 5641 | { | 5644 | { |
| 5642 | if (slab_state < FULL) | 5645 | if (slab_state < FULL) |
| 5643 | /* | 5646 | /* |
| @@ -5651,7 +5654,12 @@ void sysfs_slab_remove(struct kmem_cache *s) | |||
| 5651 | #endif | 5654 | #endif |
| 5652 | kobject_uevent(&s->kobj, KOBJ_REMOVE); | 5655 | kobject_uevent(&s->kobj, KOBJ_REMOVE); |
| 5653 | kobject_del(&s->kobj); | 5656 | kobject_del(&s->kobj); |
| 5654 | kobject_put(&s->kobj); | 5657 | } |
| 5658 | |||
| 5659 | void sysfs_slab_release(struct kmem_cache *s) | ||
| 5660 | { | ||
| 5661 | if (slab_state >= FULL) | ||
| 5662 | kobject_put(&s->kobj); | ||
| 5655 | } | 5663 | } |
| 5656 | 5664 | ||
| 5657 | /* | 5665 | /* |
