If cgroup is mounted in container,move container's tasks to the top cgroup of container. If cgroup is unmounted in container,move container's tasks back to the host's cgroup. Signed-off-by: Gao feng <gaofeng@xxxxxxxxxxxxxx> --- kernel/cgroup.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 42 insertions(+), 6 deletions(-) diff --git a/kernel/cgroup.c b/kernel/cgroup.c index ac61027..e077660 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -1110,6 +1110,7 @@ static int __rebind_subsystems_ns(struct cgroupfs_root *root, struct cgroup *parent = NULL; struct cgroupfs_root *top_root = NULL; unsigned long bit; + struct tgid_iter iter; int i; removed_mask = root->actual_subsys_mask & ~final_subsys_mask; @@ -1126,6 +1127,25 @@ static int __rebind_subsystems_ns(struct cgroupfs_root *root, BUG_ON(parent == NULL); } + /* + * Attach container's tasks to host's cgroup,since this + * top cgroup may be destroyed or changed. If task attaching + * failed, return error immediately. + */ + if (cgrp->parent) { + int error; + iter.task = NULL; + iter.tgid = 1; + for (iter = next_tgid(root->pid_ns, iter); iter.task; + iter.tgid += 1, iter = next_tgid(root->pid_ns, iter)) { + error = cgroup_attach_task(cgrp->parent, iter.task); + if (error && error != -ESRCH) { + put_task_struct(iter.task); + return error; + } + } + } + /* Process each subsystem */ for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) { struct cgroup_subsys *ss = subsys[i]; @@ -1158,15 +1178,31 @@ static int __rebind_subsystems_ns(struct cgroupfs_root *root, } } - root->top_root = top_root; - cgrp->parent = parent; - /* Link to new top_root or unlink when umounting */ - if (top_root) + if (top_root) { + root->top_root = top_root; + cgrp->parent = parent; + /* + * Attach container's tasks to the new top cgroup. + * We don't care whether some tasks are not attached + * to this cgroup successfully, it totally does no harm. + */ + iter.task = NULL; + iter.tgid = 1; + for (iter = next_tgid(root->pid_ns, iter); iter.task; + iter.tgid += 1, iter = next_tgid(root->pid_ns, iter)) { + cgroup_attach_task(cgrp, iter.task); + } + atomic_inc(&top_root->sb->s_active); + top_root->number_of_cgroups++; list_move_tail(&cgrp->allcg_node, &top_root->allcg_list); - else + } else { + root->top_root->number_of_cgroups--; + atomic_dec(&root->top_root->sb->s_active); + root->top_root = NULL; + cgrp->parent = NULL; list_del_init(&cgrp->allcg_node); - + } return 0; out: for (i = 0; i < CGROUP_SUBSYS_COUNT; i++) { -- 1.7.7.6 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers