Since memcg caches are now reparented on memcg offline, a memcg cache
can outlive its cgroup. If the memcg id is then reused for a new cgroup
with the same name, we can get cache name collision, which will result
in failures while trying to add a sysfs entry for a new cgroup's cache.
Let's fix this by appending the cache address to sysfs names of all
memcg caches so that they are guaranteed to have unique names.

Signed-off-by: Vladimir Davydov <vdavy...@parallels.com>
Cc: Johannes Weiner <han...@cmpxchg.org>
Cc: Michal Hocko <mho...@suse.cz>
Cc: Glauber Costa <glom...@gmail.com>
Cc: Christoph Lameter <c...@linux-foundation.org>
Cc: Pekka Enberg <penb...@kernel.org>
---
 mm/slub.c |   13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/mm/slub.c b/mm/slub.c
index 3ea91fb54f41..f5c74daeb46d 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5236,7 +5236,18 @@ static int sysfs_slab_add(struct kmem_cache *s)
        }
 
        s->kobj.kset = cache_kset(s);
-       err = kobject_init_and_add(&s->kobj, &slab_ktype, NULL, "%s", name);
+       /*
+        * A memcg cache can outlive its cgroup. If the memcg id is then reused
+        * for a new cgroup with the same name, we can get cache name
+        * collision. To make sure all memcg caches have unique names on sysfs,
+        * we append the cache address to its name.
+        */
+       if (is_root_cache(s))
+               err = kobject_init_and_add(&s->kobj, &slab_ktype,
+                                          NULL, "%s", name);
+       else
+               err = kobject_init_and_add(&s->kobj, &slab_ktype,
+                                          NULL, "%s-%p", name, s);
        if (err)
                goto out_put_kobj;
 
-- 
1.7.10.4

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to