]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs/pipe: write to ->poll_usage only once
authorMateusz Guzik <mjguzik@gmail.com>
Sat, 16 May 2026 02:18:52 +0000 (04:18 +0200)
committerChristian Brauner <brauner@kernel.org>
Thu, 21 May 2026 11:39:36 +0000 (13:39 +0200)
Both GNU and BSD makes share a "token pipe" between their instances, as
a result a -j $BIGNUM invocation results in multicore perf problems in
the poll handler.

Avoiding the store will reduce it a little bit. However, the crux of the
problem is the locked queuing up in poll_wait().

Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
Link: https://patch.msgid.link/20260516021852.256932-1-mjguzik@gmail.com
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/pipe.c

index 9841648c9cf3e8e569cf6ba5c792624fe92396f5..e37c79935ecb1318ee2484d44bf6276d66d406d1 100644 (file)
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -664,7 +664,8 @@ pipe_poll(struct file *filp, poll_table *wait)
        union pipe_index idx;
 
        /* Epoll has some historical nasty semantics, this enables them */
-       WRITE_ONCE(pipe->poll_usage, true);
+       if (unlikely(!READ_ONCE(pipe->poll_usage)))
+               WRITE_ONCE(pipe->poll_usage, true);
 
        /*
         * Reading pipe state only -- no need for acquiring the semaphore.