cgroup: add cgroup_subsys->css_e_css_changed()
authorTejun Heo <tj@kernel.org>
Tue, 18 Nov 2014 07:49:51 +0000 (02:49 -0500)
committerTejun Heo <tj@kernel.org>
Tue, 18 Nov 2014 07:49:51 +0000 (02:49 -0500)
Add a new cgroup_subsys operatoin ->css_e_css_changed().  This is
invoked if any of the effective csses seen from the css's cgroup may
have changed.  This will be used to implement cgroup writeback
support.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Zefan Li <lizefan@huawei.com>
include/linux/cgroup.h
kernel/cgroup.c

index e717a39..3a04aeb 100644 (file)
@@ -615,6 +615,7 @@ struct cgroup_subsys {
        void (*css_released)(struct cgroup_subsys_state *css);
        void (*css_free)(struct cgroup_subsys_state *css);
        void (*css_reset)(struct cgroup_subsys_state *css);
+       void (*css_e_css_changed)(struct cgroup_subsys_state *css);
 
        int (*can_attach)(struct cgroup_subsys_state *css,
                          struct cgroup_taskset *tset);
index c855869..69f0335 100644 (file)
@@ -2836,6 +2836,24 @@ static ssize_t cgroup_subtree_control_write(struct kernfs_open_file *of,
                }
        }
 
+       /*
+        * The effective csses of all the descendants (excluding @cgrp) may
+        * have changed.  Subsystems can optionally subscribe to this event
+        * by implementing ->css_e_css_changed() which is invoked if any of
+        * the effective csses seen from the css's cgroup may have changed.
+        */
+       for_each_subsys(ss, ssid) {
+               struct cgroup_subsys_state *this_css = cgroup_css(cgrp, ss);
+               struct cgroup_subsys_state *css;
+
+               if (!ss->css_e_css_changed || !this_css)
+                       continue;
+
+               css_for_each_descendant_pre(css, this_css)
+                       if (css != this_css)
+                               ss->css_e_css_changed(css);
+       }
+
        kernfs_activate(cgrp->kn);
        ret = 0;
 out_unlock: