aboutsummaryrefslogtreecommitdiffstats
path: root/mm/slub.c
diff options
context:
space:
mode:
authorVladimir Davydov <vdavydov@parallels.com>2014-04-07 18:39:31 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-04-07 19:36:13 -0400
commit9a41707bd3a0811919000daf094e9d50ea65f7da (patch)
treeb42ddbd3089e948f5a623132cf8bed7215707327 /mm/slub.c
parent84d0ddd6b0e3187d85e609c2d10c36089cf0be04 (diff)
slub: rework sysfs layout for memcg caches
Currently, we try to arrange sysfs entries for memcg caches in the same manner as for global caches. Apart from turning /sys/kernel/slab into a mess when there are a lot of kmem-active memcgs created, it actually does not work properly - we won't create more than one link to a memcg cache in case its parent is merged with another cache. For instance, if A is a root cache merged with another root cache B, we will have the following sysfs setup: X A -> X B -> X where X is some unique id (see create_unique_id()). Now if memcgs M and N start to allocate from cache A (or B, which is the same), we will get: X X:M X:N A -> X B -> X A:M -> X:M A:N -> X:N Since B is an alias for A, we won't get entries B:M and B:N, which is confusing. It is more logical to have entries for memcg caches under the corresponding root cache's sysfs directory. This would allow us to keep sysfs layout clean, and avoid such inconsistencies like one described above. This patch does the trick. It creates a "cgroup" kset in each root cache kobject to keep its children caches there. Signed-off-by: Vladimir Davydov <vdavydov@parallels.com> Cc: Michal Hocko <mhocko@suse.cz> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: David Rientjes <rientjes@google.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: Glauber Costa <glommer@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/slub.c')
-rw-r--r--mm/slub.c26
1 files changed, 25 insertions, 1 deletions
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 = {
5138 5138
5139static struct kset *slab_kset; 5139static struct kset *slab_kset;
5140 5140
5141static 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);