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

Commit afbcb364 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Tejun Heo
Browse files

cgroup: pids: kill pids_fork(), simplify pids_can_fork() and pids_cancel_fork()



Now that we know that the forking task can't migrate amd the child is always
moved to the same cgroup by cgroup_post_fork()->css_set_move_task() we can
change pids_can_fork() and pids_cancel_fork() to just use task_css(current).
And since we no longer need to pin this css, we can remove pid_fork().

Note: the patch uses task_css_check(true), perhaps it makes sense to add a
helper or change task_css_set_check() to take cgroup_threadgroup_rwsem into
account.

Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
Acked-by: default avatarZefan Li <lizefan@huawei.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent c9e75f04
Loading
Loading
Loading
Loading
+10 −31
Original line number Original line Diff line number Diff line
@@ -205,48 +205,28 @@ static void pids_cancel_attach(struct cgroup_subsys_state *css,
	}
	}
}
}


/*
 * task_css_check(true) in pids_can_fork() and pids_cancel_fork() relies
 * on threadgroup_change_begin() held by the copy_process().
 */
static int pids_can_fork(struct task_struct *task, void **priv_p)
static int pids_can_fork(struct task_struct *task, void **priv_p)
{
{
	struct cgroup_subsys_state *css;
	struct cgroup_subsys_state *css;
	struct pids_cgroup *pids;
	struct pids_cgroup *pids;
	int err;


	/*
	css = task_css_check(current, pids_cgrp_id, true);
	 * Use the "current" task_css for the pids subsystem as the tentative
	 * css. It is possible we will charge the wrong hierarchy, in which
	 * case we will forcefully revert/reapply the charge on the right
	 * hierarchy after it is committed to the task proper.
	 */
	css = task_get_css(current, pids_cgrp_id);
	pids = css_pids(css);
	pids = css_pids(css);

	return pids_try_charge(pids, 1);
	err = pids_try_charge(pids, 1);
	if (err)
		goto err_css_put;

	*priv_p = css;
	return 0;

err_css_put:
	css_put(css);
	return err;
}
}


static void pids_cancel_fork(struct task_struct *task, void *priv)
static void pids_cancel_fork(struct task_struct *task, void *priv)
{
{
	struct cgroup_subsys_state *css = priv;
	struct cgroup_subsys_state *css;
	struct pids_cgroup *pids = css_pids(css);
	struct pids_cgroup *pids;


	css = task_css_check(current, pids_cgrp_id, true);
	pids = css_pids(css);
	pids_uncharge(pids, 1);
	pids_uncharge(pids, 1);
	css_put(css);
}

static void pids_fork(struct task_struct *task, void *priv)
{
	struct cgroup_subsys_state *css = priv;

	WARN_ON(task_css_check(task, pids_cgrp_id, true) != css);
	css_put(css);
}
}


static void pids_free(struct task_struct *task)
static void pids_free(struct task_struct *task)
@@ -329,7 +309,6 @@ struct cgroup_subsys pids_cgrp_subsys = {
	.cancel_attach 	= pids_cancel_attach,
	.cancel_attach 	= pids_cancel_attach,
	.can_fork	= pids_can_fork,
	.can_fork	= pids_can_fork,
	.cancel_fork	= pids_cancel_fork,
	.cancel_fork	= pids_cancel_fork,
	.fork		= pids_fork,
	.free		= pids_free,
	.free		= pids_free,
	.legacy_cftypes	= pids_files,
	.legacy_cftypes	= pids_files,
	.dfl_cftypes	= pids_files,
	.dfl_cftypes	= pids_files,