Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e406d1cf authored by Tejun Heo's avatar Tejun Heo
Browse files

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: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarLi Zefan <lizefan@huawei.com>
parent 07bc356e
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -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;
}

/*