Commit 9ed52108 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Christian Brauner
Browse files

pidfd: change do_notify_pidfd() to use __wake_up(poll_to_key(EPOLLIN))

rather than wake_up_all(). This way do_notify_pidfd() won't wakeup the
POLLHUP-only waiters which wait for pid_task() == NULL.

TODO:
    - as Christian pointed out, this asks for the new wake_up_all_poll()
      helper, it can already have other users.

    - we can probably discriminate the PIDFD_THREAD and non-PIDFD_THREAD
      waiters, but this needs more work. See
      https://lore.kernel.org/all/20240205140848.GA15853@redhat.com/



Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
Link: https://lore.kernel.org/r/20240205141348.GA16539@redhat.com


Reviewed-by: default avatarTycho Andersen <tandersen@netflix.com>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent a1c6d543
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -2021,11 +2021,12 @@ int send_sigqueue(struct sigqueue *q, struct pid *pid, enum pid_type type)

void do_notify_pidfd(struct task_struct *task)
{
	struct pid *pid;
	struct pid *pid = task_pid(task);

	WARN_ON(task->exit_state == 0);
	pid = task_pid(task);
	wake_up_all(&pid->wait_pidfd);

	__wake_up(&pid->wait_pidfd, TASK_NORMAL, 0,
			poll_to_key(EPOLLIN | EPOLLRDNORM));
}

/*