Unverified Commit 35c9701e authored by Christian Brauner's avatar Christian Brauner
Browse files

exit: move wake_up_all() pidfd waiters into __unhash_process()

Move the pidfd notification out of __change_pid() and into
__unhash_process(). The only valid call to __change_pid() with a NULL
argument and PIDTYPE_PID is from __unhash_process(). This is a lot more
obvious than calling it from __change_pid().

Link: https://lore.kernel.org/20250411-work-pidfs-enoent-v2-1-60b2d3bb545f@kernel.org


Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 1e940fff
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -133,8 +133,13 @@ struct release_task_post {
static void __unhash_process(struct release_task_post *post, struct task_struct *p,
			     bool group_dead)
{
	struct pid *pid = task_pid(p);

	nr_threads--;

	detach_pid(post->pids, p, PIDTYPE_PID);
	wake_up_all(&pid->wait_pidfd);

	if (group_dead) {
		detach_pid(post->pids, p, PIDTYPE_TGID);
		detach_pid(post->pids, p, PIDTYPE_PGID);
+0 −5
Original line number Diff line number Diff line
@@ -359,11 +359,6 @@ static void __change_pid(struct pid **pids, struct task_struct *task,
	hlist_del_rcu(&task->pid_links[type]);
	*pid_ptr = new;

	if (type == PIDTYPE_PID) {
		WARN_ON_ONCE(pid_has_task(pid, PIDTYPE_PID));
		wake_up_all(&pid->wait_pidfd);
	}

	for (tmp = PIDTYPE_MAX; --tmp >= 0; )
		if (pid_has_task(pid, tmp))
			return;