On Tue, Mar 04, 2025 at 06:22:55PM +0100, Oleg Nesterov wrote: > On 03/04, Christian Brauner wrote: > > > > @@ -248,6 +260,37 @@ static long pidfd_info(struct task_struct *task, unsigned int cmd, unsigned long > > if (copy_from_user(&mask, &uinfo->mask, sizeof(mask))) > > return -EFAULT; > > > > + task = get_pid_task(pid, PIDTYPE_PID); > > + if (!task) { > > + if (!(mask & PIDFD_INFO_EXIT)) > > + return -ESRCH; > > + > > + if (!current_in_pidns(pid)) > > + return -ESRCH; > > + } > > + > > + if (mask & PIDFD_INFO_EXIT) { > > + exit_info = READ_ONCE(pidfs_i(inode)->exit_info); > > + if (exit_info) { > > +#ifdef CONFIG_CGROUPS > > + kinfo.cgroupid = exit_info->cgroupid; > > + kinfo.mask |= PIDFD_INFO_EXIT | PIDFD_INFO_CGROUPID; > > +#endif > > + kinfo.exit_code = exit_info->exit_code; > > + } > > Confused... so, without CONFIG_CGROUPS pidfd_info() will never report > PIDFD_INFO_EXIT in kinfo.mask ? Fixed. > > > --- a/include/uapi/linux/pidfd.h > > +++ b/include/uapi/linux/pidfd.h > > @@ -20,6 +20,7 @@ > > #define PIDFD_INFO_PID (1UL << 0) /* Always returned, even if not requested */ > > #define PIDFD_INFO_CREDS (1UL << 1) /* Always returned, even if not requested */ > > #define PIDFD_INFO_CGROUPID (1UL << 2) /* Always returned if available, even if not requested */ > > +#define PIDFD_INFO_EXIT (1UL << 3) /* Always returned if available, even if not requested */ > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > The comment doesn't match the "if (mask & PIDFD_INFO_EXIT)" check above... Also fixed.