Commit 26d5bbe5 authored by Tejun Heo's avatar Tejun Heo

Revert "cgroup: remove bind() method from cgroup_subsys."

This reverts commit 84cfb6ab.  There
are scheduled changes which make use of the removed callback.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Rami Rosen <ramirose@gmail.com>
Cc: Li Zefan <lizefan@huawei.com>
parent ef824fa1
...@@ -211,9 +211,10 @@ matches, and any of the requested subsystems are in use in an existing ...@@ -211,9 +211,10 @@ matches, and any of the requested subsystems are in use in an existing
hierarchy, the mount will fail with -EBUSY. Otherwise, a new hierarchy hierarchy, the mount will fail with -EBUSY. Otherwise, a new hierarchy
is activated, associated with the requested subsystems. is activated, associated with the requested subsystems.
It's not possible to bind a new subsystem to an active cgroup It's not currently possible to bind a new subsystem to an active
hierarchy, or to unbind a subsystem from an active cgroup cgroup hierarchy, or to unbind a subsystem from an active cgroup
hierarchy. hierarchy. This may be possible in future, but is fraught with nasty
error-recovery issues.
When a cgroup filesystem is unmounted, if there are any When a cgroup filesystem is unmounted, if there are any
child cgroups created below the top-level cgroup, that hierarchy child cgroups created below the top-level cgroup, that hierarchy
...@@ -381,8 +382,10 @@ To Specify a hierarchy's release_agent: ...@@ -381,8 +382,10 @@ To Specify a hierarchy's release_agent:
Note that specifying 'release_agent' more than once will return failure. Note that specifying 'release_agent' more than once will return failure.
Note that changing the set of subsystems is only supported when the Note that changing the set of subsystems is currently only supported
hierarchy consists of a single (root) cgroup. when the hierarchy consists of a single (root) cgroup. Supporting
the ability to arbitrarily bind/unbind subsystems from an existing
cgroup hierarchy is intended to be implemented in the future.
Then under /sys/fs/cgroup/rg1 you can find a tree that corresponds to the Then under /sys/fs/cgroup/rg1 you can find a tree that corresponds to the
tree of the cgroups in the system. For instance, /sys/fs/cgroup/rg1 tree of the cgroups in the system. For instance, /sys/fs/cgroup/rg1
...@@ -640,6 +643,13 @@ void exit(struct task_struct *task) ...@@ -640,6 +643,13 @@ void exit(struct task_struct *task)
Called during task exit. Called during task exit.
void bind(struct cgroup *root)
(cgroup_mutex held by caller)
Called when a cgroup subsystem is rebound to a different hierarchy
and root cgroup. Currently this will only involve movement between
the default hierarchy (which never has sub-cgroups) and a hierarchy
that is being created/destroyed (and hence has no sub-cgroups).
4. Extended attribute usage 4. Extended attribute usage
=========================== ===========================
......
...@@ -484,6 +484,8 @@ struct cgroup_subsys { ...@@ -484,6 +484,8 @@ struct cgroup_subsys {
void (*fork)(struct task_struct *task); void (*fork)(struct task_struct *task);
void (*exit)(struct cgroup *cgrp, struct cgroup *old_cgrp, void (*exit)(struct cgroup *cgrp, struct cgroup *old_cgrp,
struct task_struct *task); struct task_struct *task);
void (*bind)(struct cgroup *root);
int subsys_id; int subsys_id;
int active; int active;
int disabled; int disabled;
......
...@@ -1091,12 +1091,16 @@ static int rebind_subsystems(struct cgroupfs_root *root, ...@@ -1091,12 +1091,16 @@ static int rebind_subsystems(struct cgroupfs_root *root,
cgrp->subsys[i]->cgroup = cgrp; cgrp->subsys[i]->cgroup = cgrp;
list_move(&ss->sibling, &root->subsys_list); list_move(&ss->sibling, &root->subsys_list);
ss->root = root; ss->root = root;
if (ss->bind)
ss->bind(cgrp);
/* refcount was already taken, and we're keeping it */ /* refcount was already taken, and we're keeping it */
} else if (bit & removed_mask) { } else if (bit & removed_mask) {
/* We're removing this subsystem */ /* We're removing this subsystem */
BUG_ON(ss == NULL); BUG_ON(ss == NULL);
BUG_ON(cgrp->subsys[i] != dummytop->subsys[i]); BUG_ON(cgrp->subsys[i] != dummytop->subsys[i]);
BUG_ON(cgrp->subsys[i]->cgroup != cgrp); BUG_ON(cgrp->subsys[i]->cgroup != cgrp);
if (ss->bind)
ss->bind(dummytop);
dummytop->subsys[i]->cgroup = dummytop; dummytop->subsys[i]->cgroup = dummytop;
cgrp->subsys[i] = NULL; cgrp->subsys[i] = NULL;
subsys[i]->root = &rootnode; subsys[i]->root = &rootnode;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment