Skip to content

Commit

Permalink
cgroup: separate out cgroup_calc_child_subsys_mask() from cgroup_refr…
Browse files Browse the repository at this point in the history
…esh_child_subsys_mask()

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 <[email protected]>
Acked-by: Zefan Li <[email protected]>
  • Loading branch information
htejun committed Nov 18, 2014
1 parent cea7446 commit 0f060de
Showing 1 changed file with 24 additions and 12 deletions.
36 changes: 24 additions & 12 deletions kernel/cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}

/**
Expand Down

0 comments on commit 0f060de

Please sign in to comment.