Re: [PATCH v3 0/1] pipe: only enable the extra wake_up(rd_wait) for edge-triggered consumers

Oleg Nesterov <[email protected]> Sun, 2 Aug 2026 16:56:31 +0200
Newsgroups org.kernel.vger.io-uring,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On 07/31, Linus Torvalds wrote:
>
> My argument is that IF we change this area, we should damn well do it
> right, and document it, and make it very very clear that the *ONLY*
> reason this exists is a user space legacy bug that took advantage of
> legacy kernel behavior, and that we are papering this over.

OK, I'll rename poll_usage/poll_et to ->pseudo_edgetrigger as Christian
suggests and update the comments as below:

struct pipe_inode_info:

	@pseudo_edgetrigger: has an EPOLLET consumer, enable per-write wakeups

pipe_poll:

	/*
	 * Legacy epoll(EPOLLET) users depend on historical per-write wakeups,
	 * see 3a34b13a88ca ("pipe: make pipe writes always wake up readers")
	 * and the ->pseudo_edgetrigger check in anon_pipe_write().
	 * Currently io_uring sets EPOLLET for multishot polls, so it gets the
	 * same behaviour.
	 */
	if ((filp->f_mode & FMODE_READ) &&
	    wait && (wait->_key & EPOLLET) &&
	    unlikely(!READ_ONCE(pipe->pseudo_edgetrigger)))
		WRITE_ONCE(pipe->pseudo_edgetrigger, true);

anon_pipe_write:

	 * ->pseudo_edgetrigger enables per-write wakeups, see pipe_poll()
	 */
	if (was_empty || READ_ONCE(pipe->pseudo_edgetrigger))
		wake_up_interruptible_sync_poll(&pipe->rd_wait, EPOLLIN | EPOLLRDNORM);

Will you agree? Or should I tweak the comments somehow to make it more clear
that the only reason is a user space legacy bug?

Oleg.