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 ? > --- 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... Oleg.