memcg: force use_hierarchy if sane_behavior
authorTejun Heo <tj@kernel.org>
Mon, 15 Apr 2013 20:41:15 +0000 (13:41 -0700)
committerTejun Heo <tj@kernel.org>
Mon, 15 Apr 2013 20:46:27 +0000 (13:46 -0700)
Turn on use_hierarchy by default if sane_behavior is specified and
don't create .use_hierarchy file.

It is debatable whether to remove .use_hierarchy file or make it ro as
the former could make transition easier in certain cases; however, the
behavior changes which will be gated by sane_behavior are intensive
including changing basic meaning of certain control knobs in a few
controllers and I don't really think keeping this piece would make
things easier in any noticeable way, so let's remove it.

v2: Explain that mem_cgroup_bind() doesn't have to worry about
    children as suggested by Michal Hocko.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Li Zefan <lizefan@huawei.com>
Acked-by: Michal Hocko <mhocko@suse.cz>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
include/linux/cgroup.h
mm/memcontrol.c

index 64047ae7fde1dcac6b053b7ff974faffdf0f4303..cda7eb2239e1b309088b2189c7eec691ce167e83 100644 (file)
@@ -268,6 +268,9 @@ enum {
         *
         * - Remount is disallowed.
         *
+        * - memcg: use_hierarchy is on by default and the cgroup file for
+        *   the flag is not created.
+        *
         * The followings are planned changes.
         *
         * - release_agent will be disallowed once replacement notification
index 9715c0c491b0b543fbce46b38d4cc9a6a8ce3b97..df87bdd4d692694d8c643d0511a9592f722013b5 100644 (file)
@@ -5814,6 +5814,7 @@ static struct cftype mem_cgroup_files[] = {
        },
        {
                .name = "use_hierarchy",
+               .flags = CFTYPE_INSANE,
                .write_u64 = mem_cgroup_hierarchy_write,
                .read_u64 = mem_cgroup_hierarchy_read,
        },
@@ -6784,6 +6785,21 @@ static void mem_cgroup_move_task(struct cgroup *cont,
 }
 #endif
 
+/*
+ * Cgroup retains root cgroups across [un]mount cycles making it necessary
+ * to verify sane_behavior flag on each mount attempt.
+ */
+static void mem_cgroup_bind(struct cgroup *root)
+{
+       /*
+        * use_hierarchy is forced with sane_behavior.  cgroup core
+        * guarantees that @root doesn't have any children, so turning it
+        * on for the root memcg is enough.
+        */
+       if (cgroup_sane_behavior(root))
+               mem_cgroup_from_cont(root)->use_hierarchy = true;
+}
+
 struct cgroup_subsys mem_cgroup_subsys = {
        .name = "memory",
        .subsys_id = mem_cgroup_subsys_id,
@@ -6794,6 +6810,7 @@ struct cgroup_subsys mem_cgroup_subsys = {
        .can_attach = mem_cgroup_can_attach,
        .cancel_attach = mem_cgroup_cancel_attach,
        .attach = mem_cgroup_move_task,
+       .bind = mem_cgroup_bind,
        .base_cftypes = mem_cgroup_files,
        .early_init = 0,
        .use_id = 1,