When a parent cache changes a sysfs attr, we need to propagate that to
the children as well. For that, we unfortunately need to tap into the
slub core.

Signed-off-by: Glauber Costa <[email protected]>
CC: Christoph Lameter <[email protected]>
CC: Pekka Enberg <[email protected]>
CC: Michal Hocko <[email protected]>
CC: Kamezawa Hiroyuki <[email protected]>
CC: Johannes Weiner <[email protected]>
CC: Suleiman Souhlal <[email protected]>
---
 mm/slub.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/mm/slub.c b/mm/slub.c
index f90f612..0b68d15 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5174,6 +5174,10 @@ static ssize_t slab_attr_store(struct kobject *kobj,
        struct slab_attribute *attribute;
        struct kmem_cache *s;
        int err;
+#ifdef CONFIG_MEMCG_KMEM
+       struct kmem_cache *c;
+       struct mem_cgroup_cache_params *p;
+#endif
 
        attribute = to_slab_attr(attr);
        s = to_slab(kobj);
@@ -5182,7 +5186,19 @@ static ssize_t slab_attr_store(struct kobject *kobj,
                return -EIO;
 
        err = attribute->store(s, buf, len);
+#ifdef CONFIG_MEMCG_KMEM
+       if (slab_state < FULL)
+               return err;
 
+       if ((err < 0) || (s->memcg_params.id == -1))
+               return err;
+
+       list_for_each_entry(p, &s->memcg_params.sibling_list, sibling_list) {
+               c = container_of(p, struct kmem_cache, memcg_params);
+               /* return value determined by the parent cache only */
+               attribute->store(c, buf, len);
+       }
+#endif
        return err;
 }
 
-- 
1.7.11.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to