cgroup: reorganize cgroup_subtree_control_write()
Make the following two reorganizations to cgroup_subtree_control_write(). These are to prepare for future changes and shouldn't cause any functional difference. * Move availability above css offlining wait. * Move cgrp->child_subsys_mask update above new css creation. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org>
This commit is contained in:
parent
a497c3ba1d
commit
c29adf24e0
|
@ -2613,6 +2613,14 @@ static ssize_t cgroup_subtree_control_write(struct kernfs_open_file *of,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* unavailable or not enabled on the parent? */
|
||||||
|
if (!(cgrp_dfl_root.subsys_mask & (1 << ssid)) ||
|
||||||
|
(cgroup_parent(cgrp) &&
|
||||||
|
!(cgroup_parent(cgrp)->child_subsys_mask & (1 << ssid)))) {
|
||||||
|
ret = -ENOENT;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Because css offlining is asynchronous, userland
|
* Because css offlining is asynchronous, userland
|
||||||
* might try to re-enable the same controller while
|
* might try to re-enable the same controller while
|
||||||
|
@ -2635,14 +2643,6 @@ static ssize_t cgroup_subtree_control_write(struct kernfs_open_file *of,
|
||||||
|
|
||||||
return restart_syscall();
|
return restart_syscall();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unavailable or not enabled on the parent? */
|
|
||||||
if (!(cgrp_dfl_root.subsys_mask & (1 << ssid)) ||
|
|
||||||
(cgroup_parent(cgrp) &&
|
|
||||||
!(cgroup_parent(cgrp)->child_subsys_mask & (1 << ssid)))) {
|
|
||||||
ret = -ENOENT;
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
} else if (disable & (1 << ssid)) {
|
} else if (disable & (1 << ssid)) {
|
||||||
if (!(cgrp->child_subsys_mask & (1 << ssid))) {
|
if (!(cgrp->child_subsys_mask & (1 << ssid))) {
|
||||||
disable &= ~(1 << ssid);
|
disable &= ~(1 << ssid);
|
||||||
|
@ -2673,12 +2673,10 @@ static ssize_t cgroup_subtree_control_write(struct kernfs_open_file *of,
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
cgrp->child_subsys_mask |= enable;
|
||||||
* Create csses for enables and update child_subsys_mask. This
|
cgrp->child_subsys_mask &= ~disable;
|
||||||
* changes cgroup_e_css() results which in turn makes the
|
|
||||||
* subsequent cgroup_update_dfl_csses() associate all tasks in the
|
/* create new csses */
|
||||||
* subtree to the updated csses.
|
|
||||||
*/
|
|
||||||
for_each_subsys(ss, ssid) {
|
for_each_subsys(ss, ssid) {
|
||||||
if (!(enable & (1 << ssid)))
|
if (!(enable & (1 << ssid)))
|
||||||
continue;
|
continue;
|
||||||
|
@ -2690,9 +2688,11 @@ static ssize_t cgroup_subtree_control_write(struct kernfs_open_file *of,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cgrp->child_subsys_mask |= enable;
|
/*
|
||||||
cgrp->child_subsys_mask &= ~disable;
|
* At this point, cgroup_e_css() results reflect the new csses
|
||||||
|
* making the following cgroup_update_dfl_csses() properly update
|
||||||
|
* css associations of all tasks in the subtree.
|
||||||
|
*/
|
||||||
ret = cgroup_update_dfl_csses(cgrp);
|
ret = cgroup_update_dfl_csses(cgrp);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_undo_css;
|
goto err_undo_css;
|
||||||
|
|
Loading…
Reference in New Issue