From: Mateusz Guzik Date: Sat, 16 May 2026 02:18:52 +0000 (+0200) Subject: fs/pipe: write to ->poll_usage only once X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=7dc6acb3d56bc2c5d119c86abd8fe96034084fc8;p=thirdparty%2Fkernel%2Flinux.git fs/pipe: write to ->poll_usage only once 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 Link: https://patch.msgid.link/20260516021852.256932-1-mjguzik@gmail.com Signed-off-by: Christian Brauner (Amutable) --- diff --git a/fs/pipe.c b/fs/pipe.c index 9841648c9cf3e..e37c79935ecb1 100644 --- 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.