From: Gowrishankar M <gomuthuk@xxxxxxxxxxxxxxxxxx> In current model, task by task we populate cgroup. Incase of multi-threaded task, it becomes difficult as we should first know about list of threads created and add them one by one in cgroup. In below patch, when a thread group leader is scanned, belonging threads are also moved along with it, while populating cgroup tasks. Below steps can help to verify the patch: (1) mount -t cgroup -o cpuset cgroup /cgroup (2) /bin/mkdir /cgroup/testgroup and cd /cgroup/testgroup (3) /bin/echo 0 > cpuset.mems (4) /bin/echo 0 > cpuset.cpus (5) /bin/echo "<PID of thread group leader>" > tasks (tip: ps -aeL) (6) cat tasks and check for thread ids. Signed-off-by: Gowrishankar M <gowrishankar.m@xxxxxxxxxxxxxxxxxx> --- kernel/cgroup.c | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-) diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 35eebd5..de7f0cc 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -1279,6 +1279,7 @@ int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk) static int attach_task_by_pid(struct cgroup *cgrp, u64 pid) { struct task_struct *tsk; + struct task_struct *p; int ret; if (pid) { @@ -1288,21 +1289,23 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid) rcu_read_unlock(); return -ESRCH; } - get_task_struct(tsk); rcu_read_unlock(); if ((current->euid) && (current->euid != tsk->uid) && (current->euid != tsk->suid)) { - put_task_struct(tsk); return -EACCES; } - } else { + } else tsk = current; - get_task_struct(tsk); - } - ret = cgroup_attach_task(cgrp, tsk); - put_task_struct(tsk); + p = tsk; + do { + get_task_struct(p); + ret = cgroup_attach_task(cgrp, p); + put_task_struct(p); + if (thread_group_empty(p) && !(has_group_leader_pid(p))) + break; + } while_each_thread(tsk, p); return ret; } -- 1.5.5.1 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers