[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAJqdLrqasST2rf+TNvNarmP2fnp-7xD3dmOoBU0dRqQoqot37A@mail.gmail.com>
Date: Mon, 3 Nov 2025 16:38:24 +0100
From: Alexander Mikhalitsyn <alexander@...alicyn.com>
To: Christian Brauner <brauner@...nel.org>
Cc: linux-fsdevel@...r.kernel.org, Oleg Nesterov <oleg@...hat.com>,
Amir Goldstein <amir73il@...il.com>, Aleksa Sarai <cyphar@...har.com>,
Yu Watanabe <watanabe.yu+github@...il.com>, Josef Bacik <josef@...icpanda.com>,
Jeff Layton <jlayton@...nel.org>, Jann Horn <jannh@...gle.com>,
Luca Boccassi <luca.boccassi@...il.com>, linux-kernel@...r.kernel.org,
Alexander Viro <viro@...iv.linux.org.uk>, Jan Kara <jack@...e.cz>,
Lennart Poettering <lennart@...ttering.net>, Mike Yuan <me@...dnzj.com>,
Zbigniew Jędrzejewski-Szmek <zbyszek@...waw.pl>
Subject: Re: [PATCH 05/22] pidfd: add a new supported_mask field
Am Di., 28. Okt. 2025 um 09:46 Uhr schrieb Christian Brauner
<brauner@...nel.org>:
>
> Some of the future fields in struct pidfd_info can be optional. If the
> kernel has nothing to emit in that field, then it doesn't set the flag
> in the reply. This presents a problem: There is currently no way to know
> what mask flags the kernel supports since one can't always count on them
> being in the reply.
>
> Add a new PIDFD_INFO_SUPPORTED_MASK flag and field that the kernel can
> set in the reply. Userspace can use this to determine if the fields it
> requires from the kernel are supported. This also gives us a way to
> deprecate fields in the future, if that should become necessary.
>
> Signed-off-by: Christian Brauner <brauner@...nel.org>
Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@...onical.com>
> ---
> fs/pidfs.c | 17 ++++++++++++++++-
> include/uapi/linux/pidfd.h | 3 +++
> 2 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/fs/pidfs.c b/fs/pidfs.c
> index 7e4d90cc74ff..204ebd32791a 100644
> --- a/fs/pidfs.c
> +++ b/fs/pidfs.c
> @@ -293,6 +293,14 @@ static __u32 pidfs_coredump_mask(unsigned long mm_flags)
> return 0;
> }
>
> +/* This must be updated whenever a new flag is added */
> +#define PIDFD_INFO_SUPPORTED (PIDFD_INFO_PID | \
> + PIDFD_INFO_CREDS | \
> + PIDFD_INFO_CGROUPID | \
> + PIDFD_INFO_EXIT | \
> + PIDFD_INFO_COREDUMP | \
> + PIDFD_INFO_SUPPORTED_MASK)
> +
> static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
> {
> struct pidfd_info __user *uinfo = (struct pidfd_info __user *)arg;
> @@ -306,7 +314,7 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
> const struct cred *c;
> __u64 mask;
>
> - BUILD_BUG_ON(sizeof(struct pidfd_info) != PIDFD_INFO_SIZE_VER1);
> + BUILD_BUG_ON(sizeof(struct pidfd_info) != PIDFD_INFO_SIZE_VER2);
>
> if (!uinfo)
> return -EINVAL;
> @@ -412,6 +420,13 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
> return -ESRCH;
>
> copy_out:
> + if (mask & PIDFD_INFO_SUPPORTED_MASK) {
> + kinfo.mask |= PIDFD_INFO_SUPPORTED_MASK;
> + kinfo.supported_mask = PIDFD_INFO_SUPPORTED;
> + }
> +
> + /* Are there bits in the return mask not present in PIDFD_INFO_SUPPORTED? */
> + WARN_ON_ONCE(~PIDFD_INFO_SUPPORTED & kinfo.mask);
> /*
> * If userspace and the kernel have the same struct size it can just
> * be copied. If userspace provides an older struct, only the bits that
> diff --git a/include/uapi/linux/pidfd.h b/include/uapi/linux/pidfd.h
> index 6ccbabd9a68d..e05caa0e00fe 100644
> --- a/include/uapi/linux/pidfd.h
> +++ b/include/uapi/linux/pidfd.h
> @@ -26,9 +26,11 @@
> #define PIDFD_INFO_CGROUPID (1UL << 2) /* Always returned if available, even if not requested */
> #define PIDFD_INFO_EXIT (1UL << 3) /* Only returned if requested. */
> #define PIDFD_INFO_COREDUMP (1UL << 4) /* Only returned if requested. */
> +#define PIDFD_INFO_SUPPORTED_MASK (1UL << 5) /* Want/got supported mask flags */
>
> #define PIDFD_INFO_SIZE_VER0 64 /* sizeof first published struct */
> #define PIDFD_INFO_SIZE_VER1 72 /* sizeof second published struct */
> +#define PIDFD_INFO_SIZE_VER2 80 /* sizeof third published struct */
>
> /*
> * Values for @coredump_mask in pidfd_info.
> @@ -94,6 +96,7 @@ struct pidfd_info {
> __s32 exit_code;
> __u32 coredump_mask;
> __u32 __spare1;
> + __u64 supported_mask; /* Mask flags that this kernel supports */
> };
>
> #define PIDFS_IOCTL_MAGIC 0xFF
>
> --
> 2.47.3
>
Powered by blists - more mailing lists