Re: [PATCH v2 0/2] pidfs: ensure consistent ENOENT/ESRCH reporting

Christian Brauner
2025-04-16T20:21:07Z

[-- Attachment #1: Type: text/plain, Size: 3472 bytes --]

On Wed, Apr 16, 2025 at 09:47:34PM +0200, Christian Brauner wrote:
> On Wed, Apr 16, 2025 at 03:55:48PM +0200, Christian Brauner wrote:
> > On Tue, Apr 15, 2025 at 03:34:54PM -0700, Nathan Chancellor wrote:
> > > Hi Christian,
> > >
> > > On Fri, Apr 11, 2025 at 03:22:43PM +0200, Christian Brauner wrote:
> > > > In a prior patch series we tried to cleanly differentiate between:
> > > >
> > > > (1) The task has already been reaped.
> > > > (2) The caller requested a pidfd for a thread-group leader but the pid
> > > > actually references a struct pid that isn't used as a thread-group
> > > > leader.
> > > >
> > > > as this was causing issues for non-threaded workloads.
> > > >
> > > > But there's cases where the current simple logic is wrong. Specifically,
> > > > if the pid was a leader pid and the check races with __unhash_process().
> > > > Stabilize this by using the pidfd waitqueue lock.
> > >
> > > After the recent work in vfs-6.16.pidfs (I tested at
> > > a9d7de0f68b79e5e481967fc605698915a37ac13), I am seeing issues with using
> > > 'machinectl shell' to connect to a systemd-nspawn container on one of my
> > > machines running Fedora 41 (the container is using Rawhide).
> > >
> > > $ machinectl shell -q nathan@$DEV_IMG $SHELL -l
> > > Failed to get shell PTY: Connection timed out
> > >
> > > My initial bisect attempt landed on the merge of the first series
> > > (1e940fff9437), which does not make much sense because 4fc3f73c16d was
> > > allegedly good in my test, but I did not investigate that too hard since
> > > I have lost enough time on this as it is heh. It never reproduces at
> > > 6.15-rc1 and it consistently reproduces at a9d7de0f68b so I figured I
> > > would report it here since you mention this series is a fix for the
> > > first one. If there is any other information I can provide or patches I
> > > can test (either as fixes or for debugging), I am more than happy to do
> > > so.
>
> I can't reproduce this issue at all with vfs-6.16.pidfs unfortunately.
>
> >
> > Does the following patch make a difference for you?:
> >
> > diff --git a/kernel/fork.c b/kernel/fork.c
> > index f7403e1fb0d4..dd30f7e09917 100644
> > --- a/kernel/fork.c
> > +++ b/kernel/fork.c
> > @@ -2118,7 +2118,7 @@ int pidfd_prepare(struct pid *pid, unsigned int flags, struct file **ret)
> > scoped_guard(spinlock_irq, &pid->wait_pidfd.lock) {
> > /* Task has already been reaped. */
> > if (!pid_has_task(pid, PIDTYPE_PID))
> > - return -ESRCH;
> > + return -EINVAL;
> > /*
> > * If this struct pid isn't used as a thread-group
> > * leader but the caller requested to create a
> >
> > If it did it would be weird if the first merge is indeed marked as good.
> > What if you used a non-rawhide version of systemd? Because this might
> > also be a regression on their side.

Ok, I think I understand how this happens. dbus-broker assumes that
only EINVAL is reported by SO_PEERPIDFD when a process is reaped:

https://github.com/bus1/dbus-broker/blob/5d34d91b138fc802a016aa68c093eb81ea31139c/src/util/sockopt.c#L241

It would be great if it would also allow for ESRCH which is the correct
error code anyway. So hopefully we'll get that fixed in userspace. For
now we paper over this in the kernel in the SO_PEERPIDFD code.

Can you please test vfs-6.16.pidfs again. It has the patch I'm
appending.

[-- Attachment #2: 0001-net-pidfd-report-EINVAL-for-ESRCH.patch --]
[-- Type: text/x-diff, Size: 1360 bytes --]

From 3f662e72d51caea74370e07a3d5bad66f020423d Mon Sep 17 00:00:00 2001
From: Christian Brauner <brauner@kernel.org>
Date: Wed, 16 Apr 2025 22:05:40 +0200
Subject: [PATCH] net, pidfd: report EINVAL for ESRCH

dbus-broker relies -EINVAL being returned to indicate ESRCH in [1].
This causes issues for some workloads as reported in [2].
Paper over it until this is fixed in userspace.

Link: https://github.com/bus1/dbus-broker/blob/5d34d91b138fc802a016aa68c093eb81ea31139c/src/util/sockopt.c#L241 [1]
Link: https://lore.kernel.org/20250415223454.GA1852104@ax162 [2]
Signed-off-by: Christian Brauner <brauner@kernel.org>
---
net/core/sock.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/net/core/sock.c b/net/core/sock.c
index f67a3c5b0988..ed8e7fd36284 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1893,8 +1893,16 @@ int sk_getsockopt(struct sock *sk, int level, int optname,

pidfd = pidfd_prepare(peer_pid, 0, &pidfd_file);
put_pid(peer_pid);
- if (pidfd < 0)
+ if (pidfd < 0) {
+ /*
+ * dbus-broker relies -EINVAL being returned to
+ * indicate ESRCH. Paper over it until this is
+ * fixed in userspace.
+ */
+ if (pidfd == -ESRCH)
+ pidfd = -EINVAL;
return pidfd;
+ }

if (copy_to_sockptr(optval, &pidfd, len) ||
copy_to_sockptr(optlen, &len, sizeof(int))) {
--
2.47.2