cgroup: reimplement cgroup_transfer_tasks() without using css_scan_tasks()

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>
This commit is contained in:
Tejun Heo 2014-02-13 06:58:39 -05:00
parent 07bc356ed2
commit e406d1cfff

View 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;
}
/*