pidfd: implement PIDFD_THREAD flag for pidfd_open()
authorOleg Nesterov <oleg@redhat.com>
Wed, 31 Jan 2024 13:26:02 +0000 (14:26 +0100)
committerChristian Brauner <brauner@kernel.org>
Fri, 2 Feb 2024 12:12:28 +0000 (13:12 +0100)
commit64bef697d33b75fc06c5789b3f8108680271529f
treedacc56670ce9a76cb7252e69dd88fcdeb7d72f2f
parent21e25205d7f9b6d7d3807546dd12ea93844b7c8e
pidfd: implement PIDFD_THREAD flag for pidfd_open()

With this flag:

- pidfd_open() doesn't require that the target task must be
  a thread-group leader

- pidfd_poll() succeeds when the task exits and becomes a
  zombie (iow, passes exit_notify()), even if it is a leader
  and thread-group is not empty.

  This means that the behaviour of pidfd_poll(PIDFD_THREAD,
  pid-of-group-leader) is not well defined if it races with
  exec() from its sub-thread; pidfd_poll() can succeed or not
  depending on whether pidfd_task_exited() is called before
  or after exchange_tids().

  Perhaps we can improve this behaviour later, pidfd_poll()
  can probably take sig->group_exec_task into account. But
  this doesn't really differ from the case when the leader
  exits before other threads (so pidfd_poll() succeeds) and
  then another thread execs and pidfd_poll() will block again.

thread_group_exited() is no longer used, perhaps it can die.

Co-developed-by: Tycho Andersen <tycho@tycho.pizza>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Link: https://lore.kernel.org/r/20240131132602.GA23641@redhat.com
Tested-by: Tycho Andersen <tandersen@netflix.com>
Reviewed-by: Tycho Andersen <tandersen@netflix.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/exec.c
include/linux/pid.h
include/uapi/linux/pidfd.h
kernel/exit.c
kernel/fork.c
kernel/pid.c
kernel/signal.c