diff options
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 26 |
1 files changed, 25 insertions, 1 deletions
@@ -5138,6 +5138,15 @@ static const struct kset_uevent_ops slab_uevent_ops = { | |||
5138 | 5138 | ||
5139 | static struct kset *slab_kset; | 5139 | static struct kset *slab_kset; |
5140 | 5140 | ||
5141 | static inline struct kset *cache_kset(struct kmem_cache *s) | ||
5142 | { | ||
5143 | #ifdef CONFIG_MEMCG_KMEM | ||
5144 | if (!is_root_cache(s)) | ||
5145 | return s->memcg_params->root_cache->memcg_kset; | ||
5146 | #endif | ||
5147 | return slab_kset; | ||
5148 | } | ||
5149 | |||
5141 | #define ID_STR_LENGTH 64 | 5150 | #define ID_STR_LENGTH 64 |
5142 | 5151 | ||
5143 | /* Create a unique string id for a slab cache: | 5152 | /* Create a unique string id for a slab cache: |
@@ -5203,7 +5212,7 @@ static int sysfs_slab_add(struct kmem_cache *s) | |||
5203 | name = create_unique_id(s); | 5212 | name = create_unique_id(s); |
5204 | } | 5213 | } |
5205 | 5214 | ||
5206 | s->kobj.kset = slab_kset; | 5215 | s->kobj.kset = cache_kset(s); |
5207 | err = kobject_init_and_add(&s->kobj, &slab_ktype, NULL, "%s", name); | 5216 | err = kobject_init_and_add(&s->kobj, &slab_ktype, NULL, "%s", name); |
5208 | if (err) { | 5217 | if (err) { |
5209 | kobject_put(&s->kobj); | 5218 | kobject_put(&s->kobj); |
@@ -5216,6 +5225,18 @@ static int sysfs_slab_add(struct kmem_cache *s) | |||
5216 | kobject_put(&s->kobj); | 5225 | kobject_put(&s->kobj); |
5217 | return err; | 5226 | return err; |
5218 | } | 5227 | } |
5228 | |||
5229 | #ifdef CONFIG_MEMCG_KMEM | ||
5230 | if (is_root_cache(s)) { | ||
5231 | s->memcg_kset = kset_create_and_add("cgroup", NULL, &s->kobj); | ||
5232 | if (!s->memcg_kset) { | ||
5233 | kobject_del(&s->kobj); | ||
5234 | kobject_put(&s->kobj); | ||
5235 | return -ENOMEM; | ||
5236 | } | ||
5237 | } | ||
5238 | #endif | ||
5239 | |||
5219 | kobject_uevent(&s->kobj, KOBJ_ADD); | 5240 | kobject_uevent(&s->kobj, KOBJ_ADD); |
5220 | if (!unmergeable) { | 5241 | if (!unmergeable) { |
5221 | /* Setup first alias */ | 5242 | /* Setup first alias */ |
@@ -5234,6 +5255,9 @@ static void sysfs_slab_remove(struct kmem_cache *s) | |||
5234 | */ | 5255 | */ |
5235 | return; | 5256 | return; |
5236 | 5257 | ||
5258 | #ifdef CONFIG_MEMCG_KMEM | ||
5259 | kset_unregister(s->memcg_kset); | ||
5260 | #endif | ||
5237 | kobject_uevent(&s->kobj, KOBJ_REMOVE); | 5261 | kobject_uevent(&s->kobj, KOBJ_REMOVE); |
5238 | kobject_del(&s->kobj); | 5262 | kobject_del(&s->kobj); |
5239 | kobject_put(&s->kobj); | 5263 | kobject_put(&s->kobj); |