cgroup: make cgroup_calc_subtree_ss_mask() take @this_ss_mask
authorTejun Heo <tj@kernel.org>
Thu, 3 Mar 2016 14:58:01 +0000 (09:58 -0500)
committerTejun Heo <tj@kernel.org>
Thu, 3 Mar 2016 14:58:01 +0000 (09:58 -0500)
cgroup_calc_subtree_ss_mask() currently takes @cgrp and
@subtree_control.  @cgrp is used for two purposes - to decide whether
it's for default hierarchy and the mask of available subsystems.  The
former doesn't matter as the results are the same regardless.  The
latter can be specified directly through a subsystem mask.

This patch makes cgroup_calc_subtree_ss_mask() perform the same
calculations for both default and legacy hierarchies and take
@this_ss_mask for available subsystems.  @cgrp is no longer used and
dropped.  This is to allow using the function in contexts where
available controllers can't be decided from the cgroup.

v2: cgroup_refres_subtree_ss_mask() is removed by a previous patch.
    Updated accordingly.

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

index 98e644b0a532e1489c39d17eab07cb1f34b0bf77..58e02e9aa9701941e8ad3e7e21881983d9547cf1 100644 (file)
@@ -1309,18 +1309,17 @@ static umode_t cgroup_file_mode(const struct cftype *cft)
 
 /**
  * cgroup_calc_subtree_ss_mask - calculate subtree_ss_mask
- * @cgrp: the target cgroup
  * @subtree_control: the new subtree_control mask to consider
+ * @this_ss_mask: available subsystems
  *
  * On the default hierarchy, a subsystem may request other subsystems to be
  * enabled together through its ->depends_on mask.  In such cases, more
  * subsystems than specified in "cgroup.subtree_control" may be enabled.
  *
  * This function calculates which subsystems need to be enabled if
- * @subtree_control is to be applied to @cgrp.  The returned mask is always
- * a superset of @subtree_control and follows the usual hierarchy rules.
+ * @subtree_control is to be applied while restricted to @this_ss_mask.
  */
-static u16 cgroup_calc_subtree_ss_mask(struct cgroup *cgrp, u16 subtree_control)
+static u16 cgroup_calc_subtree_ss_mask(u16 subtree_control, u16 this_ss_mask)
 {
        u16 cur_ss_mask = subtree_control;
        struct cgroup_subsys *ss;
@@ -1328,9 +1327,6 @@ static u16 cgroup_calc_subtree_ss_mask(struct cgroup *cgrp, u16 subtree_control)
 
        lockdep_assert_held(&cgroup_mutex);
 
-       if (!cgroup_on_dfl(cgrp))
-               return cur_ss_mask;
-
        while (true) {
                u16 new_ss_mask = cur_ss_mask;
 
@@ -1343,7 +1339,7 @@ static u16 cgroup_calc_subtree_ss_mask(struct cgroup *cgrp, u16 subtree_control)
                 * happen only if some depended-upon subsystems were bound
                 * to non-default hierarchies.
                 */
-               new_ss_mask &= cgroup_ss_mask(cgrp);
+               new_ss_mask &= this_ss_mask;
 
                if (new_ss_mask == cur_ss_mask)
                        break;
@@ -3012,8 +3008,9 @@ static void cgroup_propagate_control(struct cgroup *cgrp)
 
        cgroup_for_each_live_descendant_pre(dsct, d_css, cgrp) {
                dsct->subtree_control &= cgroup_control(dsct);
-               dsct->subtree_ss_mask = cgroup_calc_subtree_ss_mask(dsct,
-                                                       dsct->subtree_control);
+               dsct->subtree_ss_mask =
+                       cgroup_calc_subtree_ss_mask(dsct->subtree_control,
+                                                   cgroup_ss_mask(dsct));
        }
 }