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

This reverts commit 84cfb6ab48.  There
are scheduled changes which make use of the removed callback.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Rami Rosen <ramirose@gmail.com>
Cc: Li Zefan <lizefan@huawei.com>
This commit is contained in:
Tejun Heo 2013-04-12 10:29:04 -07:00
parent ef824fa129
commit 26d5bbe5ba
3 changed files with 21 additions and 5 deletions

View File

@ -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:
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)
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
=========================== ===========================

View File

@ -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;

View File

@ -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;