mirror of https://gitee.com/openkylin/linux.git
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:
parent
07bc356ed2
commit
e406d1cfff
|
@ -2850,15 +2850,6 @@ int css_scan_tasks(struct cgroup_subsys_state *css,
|
||||||
return 0;
|
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
|
* cgroup_trasnsfer_tasks - move tasks from one cgroup to another
|
||||||
* @to: cgroup to which the tasks will be moved
|
* @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)
|
int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)
|
||||||
{
|
{
|
||||||
return css_scan_tasks(&from->dummy_css, NULL, cgroup_transfer_one_task,
|
struct css_task_iter it;
|
||||||
to, NULL);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue