diff options
| -rw-r--r-- | include/linux/slub_def.h | 3 | ||||
| -rw-r--r-- | mm/slub.c | 26 | 
2 files changed, 28 insertions, 1 deletions
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index f56bfa9e4526..f2f7398848cf 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h @@ -87,6 +87,9 @@ struct kmem_cache {  #ifdef CONFIG_MEMCG_KMEM  	struct memcg_cache_params *memcg_params;  	int max_attr_size; /* for propagation, maximum size of a stored attr */ +#ifdef CONFIG_SYSFS +	struct kset *memcg_kset; +#endif  #endif  #ifdef CONFIG_NUMA diff --git a/mm/slub.c b/mm/slub.c index 33939e72bc37..3508edec19f9 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -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);  | 
