Re: [PATCH 0/1] pipe: only enable the extra wake_up(rd_wait) when epoll is actually used

From: Pavel Begunkov

Date: Wed Jul 29 2026 - 07:59:58 EST


On 7/25/26 16:19, Oleg Nesterov wrote:
On 07/24, Oleg Nesterov wrote:

On 07/23, Oleg Nesterov wrote:

OK, sashiko has some concerns

https://sashiko.dev/#/patchset/amIqmbbZx3NlzUsX%40redhat.com

Let me quote:

Does skipping this wakeup for non-epoll consumers break io_uring?

Applications polling pipes via io_uring do not attach an eventpoll context,
so pipe->epoll_usage will be false. If a writer writes to an empty pipe,
io_uring receives the wakeup.

If the writer then writes a second chunk before the first is drained,
anon_pipe_write() observes was_empty == false and
pipe_get_epoll_usage() == false, skipping the waitqueue wakeup.

Could this cause io_uring to miss events and hang permanently, waiting
for a CQE that will never be emitted for the new data?

and I am starting to think sashiko is right (damn as always ;) and this
patch does affect/break io_uring.

Jens, could you confirm? If yes, we need to update the comments in pipe.c
(I've attached 1/1 at the end, so that you can see what this patch does)
...
It seems that IORING_OP_POLL_ADD / IORING_POLL_ADD_MULTI is edge-triggered
by default! Like EPOLL_CTL_ADD / EPOLLET.

Yes, sashiko is right. With some help from AI I wrote the simple test-case

https://github.com/axboe/liburing/blob/master/man/io_uring_enter.2#L400

Seems like it's even documented, which is a shame because I deem
IORING_OP_POLL_ADD + IORING_POLL_ADD_MULTI to be a half broken API that
should be deprecated after investigating lxc problems with it some years
back. Makes me wonder, likely it wouldn't even break anything if shifts
from strict edge definition for pipes. It's a stream, and the user doesn't
generally know the number of bytes sitting there.

--
Pavel Begunkov