|
@@ -5138,6 +5138,15 @@ static const struct kset_uevent_ops slab_uevent_ops = {
|
|
|
|
|
|
static struct kset *slab_kset;
|
|
|
|
|
|
+static inline struct kset *cache_kset(struct kmem_cache *s)
|
|
|
+{
|
|
|
+#ifdef CONFIG_MEMCG_KMEM
|
|
|
+ if (!is_root_cache(s))
|
|
|
+ return s->memcg_params->root_cache->memcg_kset;
|
|
|
+#endif
|
|
|
+ return slab_kset;
|
|
|
+}
|
|
|
+
|
|
|
#define ID_STR_LENGTH 64
|
|
|
|
|
|
/* Create a unique string id for a slab cache:
|
|
@@ -5203,7 +5212,7 @@ static int sysfs_slab_add(struct kmem_cache *s)
|
|
|
name = create_unique_id(s);
|
|
|
}
|
|
|
|
|
|
- s->kobj.kset = slab_kset;
|
|
|
+ s->kobj.kset = cache_kset(s);
|
|
|
err = kobject_init_and_add(&s->kobj, &slab_ktype, NULL, "%s", name);
|
|
|
if (err) {
|
|
|
kobject_put(&s->kobj);
|
|
@@ -5216,6 +5225,18 @@ static int sysfs_slab_add(struct kmem_cache *s)
|
|
|
kobject_put(&s->kobj);
|
|
|
return err;
|
|
|
}
|
|
|
+
|
|
|
+#ifdef CONFIG_MEMCG_KMEM
|
|
|
+ if (is_root_cache(s)) {
|
|
|
+ s->memcg_kset = kset_create_and_add("cgroup", NULL, &s->kobj);
|
|
|
+ if (!s->memcg_kset) {
|
|
|
+ kobject_del(&s->kobj);
|
|
|
+ kobject_put(&s->kobj);
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
kobject_uevent(&s->kobj, KOBJ_ADD);
|
|
|
if (!unmergeable) {
|
|
|
/* Setup first alias */
|
|
@@ -5234,6 +5255,9 @@ static void sysfs_slab_remove(struct kmem_cache *s)
|
|
|
*/
|
|
|
return;
|
|
|
|
|
|
+#ifdef CONFIG_MEMCG_KMEM
|
|
|
+ kset_unregister(s->memcg_kset);
|
|
|
+#endif
|
|
|
kobject_uevent(&s->kobj, KOBJ_REMOVE);
|
|
|
kobject_del(&s->kobj);
|
|
|
kobject_put(&s->kobj);
|