Revert "pidfd_poll: report POLLHUP when pid_task() == NULL"

This reverts commit 43f0df54c9.

Change-Id: Id5c8932073dd90b073d8c8e1b7f06a9da5b5bc02
Signed-off-by: Terence Tritton <ttritton@google.com>
Bug: 352286227
This commit is contained in:
Terence Tritton
2024-08-14 19:18:16 +00:00
committed by Treehugger Robot
parent 76e9569945
commit d3ec16ca12
2 changed files with 19 additions and 12 deletions

View File

@@ -89,6 +89,23 @@ static void pidfd_show_fdinfo(struct seq_file *m, struct file *f)
}
#endif
static bool pidfd_task_exited(struct pid *pid, bool thread)
{
struct task_struct *task;
bool exited;
rcu_read_lock();
task = pid_task(pid, PIDTYPE_PID);
exited = !task ||
(READ_ONCE(task->exit_state) && (thread || thread_group_empty(task)));
rcu_read_unlock();
return exited;
}
/*
* Poll support for process exit notification.
*/
@@ -96,7 +113,6 @@ static __poll_t pidfd_poll(struct file *file, struct poll_table_struct *pts)
{
struct pid *pid = pidfd_pid(file);
bool thread = file->f_flags & PIDFD_THREAD;
struct task_struct *task;
__poll_t poll_flags = 0;
poll_wait(file, &pid->wait_pidfd, pts);
@@ -104,12 +120,8 @@ static __poll_t pidfd_poll(struct file *file, struct poll_table_struct *pts)
* Depending on PIDFD_THREAD, inform pollers when the thread
* or the whole thread-group exits.
*/
guard(rcu)();
task = pid_task(pid, PIDTYPE_PID);
if (!task)
poll_flags = EPOLLIN | EPOLLRDNORM | EPOLLHUP;
else if (task->exit_state && (thread || thread_group_empty(task)))
poll_flags = EPOLLIN | EPOLLRDNORM;
if(pidfd_task_exited(pid, thread))
poll_flags = EPOLLIN | EPOLLRDNORM;
return poll_flags;
}

View File

@@ -355,11 +355,6 @@ static void __change_pid(struct task_struct *task, enum pid_type type,
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;