summaryrefslogtreecommitdiffstats
path: root/kernel/cgroup.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2014-07-09 00:02:57 +0200
committerTejun Heo <tj@kernel.org>2014-07-09 00:02:57 +0200
commitb4536f0cab2b18414e26101a2b9d484c5cbea0c0 (patch)
treebdd7ecc28ee6ae1d558f2fa99a49b95ffd19b655 /kernel/cgroup.c
parentcgroup: make interface files visible iff enabled on cgroup->subtree_control (diff)
downloadlinux-b4536f0cab2b18414e26101a2b9d484c5cbea0c0.tar.xz
linux-b4536f0cab2b18414e26101a2b9d484c5cbea0c0.zip
cgroup: implement cgroup_subsys->css_reset()
cgroup is implementing support for subsystem dependency which would require a way to enable a subsystem even when it's not directly configured through "cgroup.subtree_control". The previous patches added support for explicitly and implicitly enabled subsystems and showing/hiding their interface files. An explicitly enabled subsystem may become implicitly enabled if it's turned off through "cgroup.subtree_control" but there are subsystems depending on it. In such cases, the subsystem, as it's turned off when seen from userland, shouldn't enforce any resource control. Also, the subsystem may be explicitly turned on later again and its interface files should be as close to the intial state as possible. This patch adds cgroup_subsys->css_reset() which is invoked when a css is hidden. The callback should disable resource control and reset the state to the vanilla state. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Li Zefan <lizefan@huawei.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Diffstat (limited to 'kernel/cgroup.c')
-rw-r--r--kernel/cgroup.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 331fa296c7e0..3a6b77d7ba4a 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -2740,17 +2740,25 @@ static ssize_t cgroup_subtree_control_write(struct kernfs_open_file *of,
/*
* All tasks are migrated out of disabled csses. Kill or hide
* them. A css is hidden when the userland requests it to be
- * disabled while other subsystems are still depending on it.
+ * disabled while other subsystems are still depending on it. The
+ * css must not actively control resources and be in the vanilla
+ * state if it's made visible again later. Controllers which may
+ * be depended upon should provide ->css_reset() for this purpose.
*/
for_each_subsys(ss, ssid) {
if (!(disable & (1 << ssid)))
continue;
cgroup_for_each_live_child(child, cgrp) {
- if (css_disable & (1 << ssid))
- kill_css(cgroup_css(child, ss));
- else
+ struct cgroup_subsys_state *css = cgroup_css(child, ss);
+
+ if (css_disable & (1 << ssid)) {
+ kill_css(css);
+ } else {
cgroup_clear_dir(child, 1 << ssid);
+ if (ss->css_reset)
+ ss->css_reset(css);
+ }
}
}