pidfd: exit: kill the no longer used thread_group_exited()

Message ID 20240205174347.GA31461@redhat.com
State New
Headers
Series pidfd: exit: kill the no longer used thread_group_exited() |

Commit Message

Oleg Nesterov Feb. 5, 2024, 5:43 p.m. UTC
  It was used by pidfd_poll() but now it has no callers.

If it finally finds a modular user we can revert this change, but note
that the comment above this helper and the changelog in 38fd525a4c61
("exit: Factor thread_group_exited out of pidfd_poll") are not accurate,
thread_group_exited() won't return true if all other threads have passed
exit_notify() and are zombies, it returns true only when all other threads
are completely gone. Not to mention that it can only work if the task
identified by @pid is a thread-group leader.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
 include/linux/sched/signal.h |  2 --
 kernel/exit.c                | 24 ------------------------
 2 files changed, 26 deletions(-)
  

Comments

Christian Brauner Feb. 6, 2024, 1:03 p.m. UTC | #1
On Mon, 05 Feb 2024 18:43:47 +0100, Oleg Nesterov wrote:
> It was used by pidfd_poll() but now it has no callers.
> 
> If it finally finds a modular user we can revert this change, but note
> that the comment above this helper and the changelog in 38fd525a4c61
> ("exit: Factor thread_group_exited out of pidfd_poll") are not accurate,
> thread_group_exited() won't return true if all other threads have passed
> exit_notify() and are zombies, it returns true only when all other threads
> are completely gone. Not to mention that it can only work if the task
> identified by @pid is a thread-group leader.
> 
> [...]

Applied to the vfs.pidfd branch of the vfs/vfs.git tree.
Patches in the vfs.pidfd branch should appear in linux-next soon.

Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.

It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.

Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: vfs.pidfd

[1/1] pidfd: exit: kill the no longer used thread_group_exited()
      https://git.kernel.org/vfs/vfs/c/3cad8297df1b
  
Tycho Andersen Feb. 6, 2024, 5:04 p.m. UTC | #2
On Mon, Feb 05, 2024 at 06:43:47PM +0100, Oleg Nesterov wrote:
> It was used by pidfd_poll() but now it has no callers.
> 
> If it finally finds a modular user we can revert this change, but note
> that the comment above this helper and the changelog in 38fd525a4c61
> ("exit: Factor thread_group_exited out of pidfd_poll") are not accurate,
> thread_group_exited() won't return true if all other threads have passed
> exit_notify() and are zombies, it returns true only when all other threads
> are completely gone. Not to mention that it can only work if the task
> identified by @pid is a thread-group leader.
> 
> Signed-off-by: Oleg Nesterov <oleg@redhat.com>

Reviewed-by: Tycho Andersen <tandersen@netflix.com>
  
Christian Brauner Feb. 7, 2024, 8:45 a.m. UTC | #3
On Tue, Feb 06, 2024 at 10:04:08AM -0700, Tycho Andersen wrote:
> On Mon, Feb 05, 2024 at 06:43:47PM +0100, Oleg Nesterov wrote:
> > It was used by pidfd_poll() but now it has no callers.
> > 
> > If it finally finds a modular user we can revert this change, but note
> > that the comment above this helper and the changelog in 38fd525a4c61
> > ("exit: Factor thread_group_exited out of pidfd_poll") are not accurate,
> > thread_group_exited() won't return true if all other threads have passed
> > exit_notify() and are zombies, it returns true only when all other threads
> > are completely gone. Not to mention that it can only work if the task
> > identified by @pid is a thread-group leader.
> > 
> > Signed-off-by: Oleg Nesterov <oleg@redhat.com>
> 
> Reviewed-by: Tycho Andersen <tandersen@netflix.com>

On Tue, Feb 06, 2024 at 10:03:41AM -0700, Tycho Andersen wrote:
> On Mon, Feb 05, 2024 at 03:13:48PM +0100, Oleg Nesterov wrote:
> > 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: Oleg Nesterov <oleg@redhat.com>
> 
> Reviewed-by: Tycho Andersen <tandersen@netflix.com>

I updated the trailers with your RVBs.
  

Patch

diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h
index 4b7664c56208..0a0e23c45406 100644
--- a/include/linux/sched/signal.h
+++ b/include/linux/sched/signal.h
@@ -735,8 +735,6 @@  static inline int thread_group_empty(struct task_struct *p)
 #define delay_group_leader(p) \
 		(thread_group_leader(p) && !thread_group_empty(p))
 
-extern bool thread_group_exited(struct pid *pid);
-
 extern struct sighand_struct *__lock_task_sighand(struct task_struct *task,
 							unsigned long *flags);
 
diff --git a/kernel/exit.c b/kernel/exit.c
index 493647fd7c07..41a12630cbbc 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -1896,30 +1896,6 @@  COMPAT_SYSCALL_DEFINE5(waitid,
 }
 #endif
 
-/**
- * thread_group_exited - check that a thread group has exited
- * @pid: tgid of thread group to be checked.
- *
- * Test if the thread group represented by tgid has exited (all
- * threads are zombies, dead or completely gone).
- *
- * Return: true if the thread group has exited. false otherwise.
- */
-bool thread_group_exited(struct pid *pid)
-{
-	struct task_struct *task;
-	bool exited;
-
-	rcu_read_lock();
-	task = pid_task(pid, PIDTYPE_PID);
-	exited = !task ||
-		(READ_ONCE(task->exit_state) && thread_group_empty(task));
-	rcu_read_unlock();
-
-	return exited;
-}
-EXPORT_SYMBOL(thread_group_exited);
-
 /*
  * This needs to be __function_aligned as GCC implicitly makes any
  * implementation of abort() cold and drops alignment specified by