Re: [PATCH] cgroup/cpuset: fix circular locking dependency
From: Prateek Sood <hidden>
Date: 2017-12-15 08:55:15
Also in:
lkml
Subsystem:
control group (cgroup), the rest · Maintainers:
Tejun Heo, Johannes Weiner, Michal Koutný, Linus Torvalds
On 12/13/2017 09:10 PM, Tejun Heo wrote: Hi TJ,
Hello, Prateek. On Wed, Dec 13, 2017 at 07:58:24PM +0530, Prateek Sood wrote:quoted
Did you mean something like below. If not then could you please share a patch for this problem in cgroup_transfer_tasks().Oh we surely can add a new iterator but we can just count in cgroup_transfer_tasks() too, right?
I did not get what you meant by this. Could you please share a patch for this.
Thanks.
Following are two ways to improve cgroup_transfer_tasks(). In both cases task in PF_EXITING state would be left in source cgroup. It would be removed from cgroup_exit() in exit path.
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index 024085d..e2bdcdb 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c@@ -123,7 +123,10 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) */ do { css_task_iter_start(&from->self, 0, &it); - task = css_task_iter_next(&it); + do { + task = css_task_iter_next(&it); + } while (task && (task & PF_EXITING)) + if (task) get_task_struct(task); css_task_iter_end(&it); ----------------------------8<---------------------------------
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index 024085d..843b8bb 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c@@ -121,12 +121,11 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) * Migrate tasks one-by-one until @from is empty. This fails iff * ->can_attach() fails. */ + css_task_iter_start(&from->self, 0, &it); do { - css_task_iter_start(&from->self, 0, &it); task = css_task_iter_next(&it); if (task) get_task_struct(task); - css_task_iter_end(&it); if (task) { ret = cgroup_migrate(task, false, &mgctx);
@@ -135,6 +134,7 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from) put_task_struct(task); } } while (task && !ret); + css_task_iter_end(&it); out_err: cgroup_migrate_finish(&mgctx); percpu_up_write(&cgroup_threadgroup_rwsem);
Thanks -- Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc., is a member of Code Aurora Forum, a Linux Foundation Collaborative Project