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 | #define PIDFD_SIGNAL_THREAD_GROUP (1UL << 1) | 16 | #define PIDFD_SIGNAL_THREAD_GROUP (1UL << 1) |
| 17 | #define PIDFD_SIGNAL_PROCESS_GROUP (1UL << 2) | 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 | #define PIDFS_IOCTL_MAGIC 0xFF | 68 | #define PIDFS_IOCTL_MAGIC 0xFF |
| 20 | 69 | ||
| 21 | #define PIDFD_GET_CGROUP_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 1) | 70 | #define PIDFD_GET_CGROUP_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 1) |
| @@ -28,5 +77,6 @@ · 6 unmodified lines | |||
| 28 | #define PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 8) | 77 | #define PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 8) |
| 29 | #define PIDFD_GET_USER_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 9) | 78 | #define PIDFD_GET_USER_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 9) |
| 30 | #define PIDFD_GET_UTS_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 10) | 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 | #endif /* _UAPI_LINUX_PIDFD_H */ | 82 | #endif /* _UAPI_LINUX_PIDFD_H */ |