Messages in this thread | | | Date | Wed, 31 Jan 2024 10:23:54 -0700 | From | Tycho Andersen <> | Subject | Re: [PATCH v3 1/1] pidfd: implement PIDFD_THREAD flag for pidfd_open() |
| |
Hi Oleg,
On Wed, Jan 31, 2024 at 02:26:02PM +0100, Oleg Nesterov wrote: > 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.
I don't have a strong opinion here; leaving it "undefined" for now is fine with me.
> @@ -2173,7 +2195,9 @@ static int __pidfd_prepare(struct pid *pid, unsigned int flags, struct file **re > */ > int pidfd_prepare(struct pid *pid, unsigned int flags, struct file **ret) > { > - if (!pid || !pid_has_task(pid, PIDTYPE_TGID)) > + bool thread = flags & PIDFD_THREAD; > + > + if (!pid || !pid_has_task(pid, thread ? PIDTYPE_PID : PIDTYPE_TGID));
Small typo here, trailing ;. When I fix that, tests pass for me.
Assuming that's fixed up:
Reviewed-by: Tycho Andersen <tandersen@netflix.com> Tested-by: Tycho Andersen <tandersen@netflix.com>
Thanks for your help!
Tycho
| |