cgroup: separate out cgroup_calc_child_subsys_mask() from cgroup_refresh_child_subsys...
authorTejun Heo <tj@kernel.org>
Tue, 18 Nov 2014 07:49:50 +0000 (02:49 -0500)
committerTejun Heo <tj@kernel.org>
Tue, 18 Nov 2014 07:49:50 +0000 (02:49 -0500)
cgroup_refresh_child_subsys_mask() calculates and updates the
effective @cgrp->child_subsys_maks according to the current
@cgrp->subtree_control.  Separate out the calculation part into
cgroup_calc_child_subsys_mask().  This will be used to fix a bug in
the async css offline wait logic.

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

index 136ecea..1dda601 100644 (file)
@@ -1019,31 +1019,30 @@ static void cgroup_put(struct cgroup *cgrp)
 }
 
 /**
- * cgroup_refresh_child_subsys_mask - update child_subsys_mask
+ * cgroup_calc_child_subsys_mask - calculate child_subsys_mask
  * @cgrp: the target cgroup
+ * @subtree_control: the new subtree_control mask to consider
  *
  * 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 determines which subsystems need to be enabled given the
- * current @cgrp->subtree_control and records it in
- * @cgrp->child_subsys_mask.  The resulting mask is always a superset of
- * @cgrp->subtree_control and follows the usual hierarchy rules.
+ * 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.
  */
-static void cgroup_refresh_child_subsys_mask(struct cgroup *cgrp)
+static unsigned int cgroup_calc_child_subsys_mask(struct cgroup *cgrp,
+                                                 unsigned int subtree_control)
 {
        struct cgroup *parent = cgroup_parent(cgrp);
-       unsigned int cur_ss_mask = cgrp->subtree_control;
+       unsigned int cur_ss_mask = subtree_control;
        struct cgroup_subsys *ss;
        int ssid;
 
        lockdep_assert_held(&cgroup_mutex);
 
-       if (!cgroup_on_dfl(cgrp)) {
-               cgrp->child_subsys_mask = cur_ss_mask;
-               return;
-       }
+       if (!cgroup_on_dfl(cgrp))
+               return cur_ss_mask;
 
        while (true) {
                unsigned int new_ss_mask = cur_ss_mask;
@@ -1067,7 +1066,20 @@ static void cgroup_refresh_child_subsys_mask(struct cgroup *cgrp)
                cur_ss_mask = new_ss_mask;
        }
 
-       cgrp->child_subsys_mask = cur_ss_mask;
+       return cur_ss_mask;
+}
+
+/**
+ * cgroup_refresh_child_subsys_mask - update child_subsys_mask
+ * @cgrp: the target cgroup
+ *
+ * Update @cgrp->child_subsys_mask according to the current
+ * @cgrp->subtree_control using cgroup_calc_child_subsys_mask().
+ */
+static void cgroup_refresh_child_subsys_mask(struct cgroup *cgrp)
+{
+       cgrp->child_subsys_mask =
+               cgroup_calc_child_subsys_mask(cgrp, cgrp->subtree_control);
 }
 
 /**