Pull pidfs update from Christian Brauner: "This adds a new ioctl to retrieve information about a pidfd. A common pattern when using pidfds is having to get information about the process, which currently requires /proc being mounted, resolving the fd to a pid, and then do manual string parsing of /proc/N/status and friends. This needs to be reimplemented over and over in all userspace projects (e.g.: it has been reimplemented in systemd, dbus, dbus-daemon, polkit so far), and requires additional care in checking that the fd is still valid after having parsed the data, to avoid races. Having a programmatic API that can be used directly removes all these requirements, including having /proc mounted. As discussed at LPC24, add an ioctl with an extensible struct so that more parameters can be added later if needed. Start with returning pid/tgid/ppid and some creds unconditionally, and cgroupid optionally" * tag 'vfs-6.13.pidfs' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: pidfd: add ioctl to retrieve pid info
Showing the changes to include/uapi (1 of 3 files). Show all
Unified · Split
| @@ -16,6 +16,55 @@ · 15 unmodified lines | ||
| 16 | 16 | #define PIDFD_SIGNAL_THREAD_GROUP (1UL << 1) |
| 17 | 17 | #define PIDFD_SIGNAL_PROCESS_GROUP (1UL << 2) |
| 18 | 18 | |
| 19 | +/* Flags for pidfd_info. */ | |
| 20 | +#define PIDFD_INFO_PID (1UL << 0) /* Always returned, even if not requested */ | |
| 21 | +#define PIDFD_INFO_CREDS (1UL << 1) /* Always returned, even if not requested */ | |
| 22 | +#define PIDFD_INFO_CGROUPID (1UL << 2) /* Always returned if available, even if not requested */ | |
| 23 | + | |
| 24 | +#define PIDFD_INFO_SIZE_VER0 64 /* sizeof first published struct */ | |
| 25 | + | |
| 26 | +struct pidfd_info { | |
| 27 | + /* | |
| 28 | + * This mask is similar to the request_mask in statx(2). | |
| 29 | + * | |
| 30 | + * Userspace indicates what extensions or expensive-to-calculate fields | |
| 31 | + * they want by setting the corresponding bits in mask. The kernel | |
| 32 | + * will ignore bits that it does not know about. | |
| 33 | + * | |
| 34 | + * When filling the structure, the kernel will only set bits | |
| 35 | + * corresponding to the fields that were actually filled by the kernel. | |
| 36 | + * This also includes any future extensions that might be automatically | |
| 37 | + * filled. If the structure size is too small to contain a field | |
| 38 | + * (requested or not), to avoid confusion the mask will not | |
| 39 | + * contain a bit for that field. | |
| 40 | + * | |
| 41 | + * As such, userspace MUST verify that mask contains the | |
| 42 | + * corresponding flags after the ioctl(2) returns to ensure that it is | |
| 43 | + * using valid data. | |
| 44 | + */ | |
| 45 | + __u64 mask; | |
| 46 | + /* | |
| 47 | + * The information contained in the following fields might be stale at the | |
| 48 | + * time it is received, as the target process might have exited as soon as | |
| 49 | + * the IOCTL was processed, and there is no way to avoid that. However, it | |
| 50 | + * is guaranteed that if the call was successful, then the information was | |
| 51 | + * correct and referred to the intended process at the time the work was | |
| 52 | + * performed. */ | |
| 53 | + __u64 cgroupid; | |
| 54 | + __u32 pid; | |
| 55 | + __u32 tgid; | |
| 56 | + __u32 ppid; | |
| 57 | + __u32 ruid; | |
| 58 | + __u32 rgid; | |
| 59 | + __u32 euid; | |
| 60 | + __u32 egid; | |
| 61 | + __u32 suid; | |
| 62 | + __u32 sgid; | |
| 63 | + __u32 fsuid; | |
| 64 | + __u32 fsgid; | |
| 65 | + __u32 spare0[1]; | |
| 66 | +}; | |
| 67 | + | |
| 19 | 68 | #define PIDFS_IOCTL_MAGIC 0xFF |
| 20 | 69 | |
| 21 | 70 | #define PIDFD_GET_CGROUP_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 1) |
| @@ -28,5 +77,6 @@ · 6 unmodified lines | ||
| 28 | 77 | #define PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 8) |
| 29 | 78 | #define PIDFD_GET_USER_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 9) |
| 30 | 79 | #define PIDFD_GET_UTS_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 10) |
| 80 | +#define PIDFD_GET_INFO _IOWR(PIDFS_IOCTL_MAGIC, 11, struct pidfd_info) | |
| 31 | 81 | |
| 32 | 82 | #endif /* _UAPI_LINUX_PIDFD_H */ |