mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
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>
This commit is contained in:
committed by
Christian Brauner
parent
21e25205d7
commit
64bef697d3
14
kernel/pid.c
14
kernel/pid.c
@@ -552,11 +552,6 @@ struct pid *pidfd_get_pid(unsigned int fd, unsigned int *flags)
|
||||
* Return the task associated with @pidfd. The function takes a reference on
|
||||
* the returned task. The caller is responsible for releasing that reference.
|
||||
*
|
||||
* Currently, the process identified by @pidfd is always a thread-group leader.
|
||||
* This restriction currently exists for all aspects of pidfds including pidfd
|
||||
* creation (CLONE_PIDFD cannot be used with CLONE_THREAD) and pidfd polling
|
||||
* (only supports thread group leaders).
|
||||
*
|
||||
* Return: On success, the task_struct associated with the pidfd.
|
||||
* On error, a negative errno number will be returned.
|
||||
*/
|
||||
@@ -615,11 +610,8 @@ static int pidfd_create(struct pid *pid, unsigned int flags)
|
||||
* @flags: flags to pass
|
||||
*
|
||||
* This creates a new pid file descriptor with the O_CLOEXEC flag set for
|
||||
* the process identified by @pid. Currently, the process identified by
|
||||
* @pid must be a thread-group leader. This restriction currently exists
|
||||
* for all aspects of pidfds including pidfd creation (CLONE_PIDFD cannot
|
||||
* be used with CLONE_THREAD) and pidfd polling (only supports thread group
|
||||
* leaders).
|
||||
* the task identified by @pid. Without PIDFD_THREAD flag the target task
|
||||
* must be a thread-group leader.
|
||||
*
|
||||
* Return: On success, a cloexec pidfd is returned.
|
||||
* On error, a negative errno number will be returned.
|
||||
@@ -629,7 +621,7 @@ SYSCALL_DEFINE2(pidfd_open, pid_t, pid, unsigned int, flags)
|
||||
int fd;
|
||||
struct pid *p;
|
||||
|
||||
if (flags & ~PIDFD_NONBLOCK)
|
||||
if (flags & ~(PIDFD_NONBLOCK | PIDFD_THREAD))
|
||||
return -EINVAL;
|
||||
|
||||
if (pid <= 0)
|
||||
|
||||
Reference in New Issue
Block a user