cgroup: reimplement cgroup_transfer_tasks() without using css_scan_tasks()
authorTejun Heo <tj@kernel.org>
Thu, 13 Feb 2014 11:58:39 +0000 (06:58 -0500)
committerTejun Heo <tj@kernel.org>
Thu, 13 Feb 2014 11:58:39 +0000 (06:58 -0500)
Reimplement cgroup_transfer_tasks() so that it repeatedly fetches the
first task in the cgroup and then tranfers it.  This achieves the same
result without using css_scan_tasks() which is scheduled to be
removed.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
kernel/cgroup.c

index ec7746e5ded1cdf4458dc9c053968405cfe6a862..893b7b502e18673d16a130debac7bd06facc3a52 100644 (file)
@@ -2850,15 +2850,6 @@ int css_scan_tasks(struct cgroup_subsys_state *css,
        return 0;
 }
 
-static void cgroup_transfer_one_task(struct task_struct *task, void *data)
-{
-       struct cgroup *new_cgroup = data;
-
-       mutex_lock(&cgroup_mutex);
-       cgroup_attach_task(new_cgroup, task, false);
-       mutex_unlock(&cgroup_mutex);
-}
-
 /**
  * cgroup_trasnsfer_tasks - move tasks from one cgroup to another
  * @to: cgroup to which the tasks will be moved
@@ -2866,8 +2857,26 @@ static void cgroup_transfer_one_task(struct task_struct *task, void *data)
  */
 int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)
 {
-       return css_scan_tasks(&from->dummy_css, NULL, cgroup_transfer_one_task,
-                             to, NULL);
+       struct css_task_iter it;
+       struct task_struct *task;
+       int ret = 0;
+
+       do {
+               css_task_iter_start(&from->dummy_css, &it);
+               task = css_task_iter_next(&it);
+               if (task)
+                       get_task_struct(task);
+               css_task_iter_end(&it);
+
+               if (task) {
+                       mutex_lock(&cgroup_mutex);
+                       ret = cgroup_attach_task(to, task, false);
+                       mutex_unlock(&cgroup_mutex);
+                       put_task_struct(task);
+               }
+       } while (task && !ret);
+
+       return ret;
 }
 
 /*