[PATCH 0/5] pidfd: waiting on processes through pidfds

From: Christian Brauner
Date: Wed Jul 24 2019 - 10:47:26 EST


Hey everyone,

This adds the ability to wait on processes using pidfds. This is one of
the few missing pieces to make it possible to manage processes using
only pidfds.

pidfd_wait() does explicitly not allow scoping of the process referred
to by the pidfd, i.e. generic wait requests such as P_PGID and P_ALL and
other trickery such as passing in negative values and so on is not
supported.

The series also adds support for CLONE_WAIT_PID which prevents the
process referred to by the pidfd to appear in generic wait requests
similar to what is the default in FreeBSD.
This feature has been requested multiple times when I gave talks about
this work (for extensions see [1]).

The syscall patch is rather small overall. The largest portion of this
series are the tests and the cleanup to remove struct waitid_info from
exit.c.

Thanks!
Christian

[1]: In the future, we might add something like
CLONE_WAIT_STATUS_FOREIGN (or some better name).
Such pidfds will allow anyone to retrieve the exit status of a
non-parent process by calling pidfd_wait() on it without reaping
it. This has also been requested quite often and fits nicely into
the api. But that's for a later patchset.

Christian Brauner (5):
exit: kill struct waitid_info
pidfd: add pidfd_wait()
arch: wire-up pidfd_wait()
pidfd: add CLONE_WAIT_PID
pidfd: add pidfd_wait tests

arch/alpha/kernel/syscalls/syscall.tbl | 1 +
arch/arm/tools/syscall.tbl | 1 +
arch/arm64/include/asm/unistd.h | 2 +-
arch/arm64/include/asm/unistd32.h | 4 +-
arch/ia64/kernel/syscalls/syscall.tbl | 1 +
arch/m68k/kernel/syscalls/syscall.tbl | 1 +
arch/microblaze/kernel/syscalls/syscall.tbl | 1 +
arch/mips/kernel/syscalls/syscall_n32.tbl | 1 +
arch/mips/kernel/syscalls/syscall_n64.tbl | 1 +
arch/mips/kernel/syscalls/syscall_o32.tbl | 1 +
arch/parisc/kernel/syscalls/syscall.tbl | 1 +
arch/powerpc/kernel/syscalls/syscall.tbl | 1 +
arch/s390/kernel/syscalls/syscall.tbl | 1 +
arch/sh/kernel/syscalls/syscall.tbl | 1 +
arch/sparc/kernel/syscalls/syscall.tbl | 1 +
arch/x86/entry/syscalls/syscall_32.tbl | 1 +
arch/x86/entry/syscalls/syscall_64.tbl | 1 +
arch/xtensa/kernel/syscalls/syscall.tbl | 1 +
include/linux/pid.h | 5 +
include/linux/sched.h | 1 +
include/linux/syscalls.h | 4 +
include/uapi/asm-generic/unistd.h | 4 +-
include/uapi/linux/sched.h | 1 +
kernel/exit.c | 191 ++++++----
kernel/fork.c | 19 +-
kernel/signal.c | 7 +-
tools/testing/selftests/pidfd/pidfd.h | 25 ++
tools/testing/selftests/pidfd/pidfd_test.c | 14 -
tools/testing/selftests/pidfd/pidfd_wait.c | 398 ++++++++++++++++++++
29 files changed, 606 insertions(+), 85 deletions(-)
create mode 100644 tools/testing/selftests/pidfd/pidfd_wait.c

--
2.22.0