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);
 
                }
        }
 
+       /*
+        * 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: