On 03/04, Mateusz Guzik wrote: > > @@ -529,10 +529,9 @@ anon_pipe_write(struct kiocb *iocb, struct iov_iter *from) > > if (!iov_iter_count(from)) > break; > - } > > - if (!pipe_full(head, pipe->tail, pipe->max_usage)) > continue; > + } Reviewed-by: Oleg Nesterov <oleg@xxxxxxxxxx> It seems that we can also remove the unnecessary signal_pending() check, but I need to recheck and we need to cleanup the poll_usage logic first. This will also remove the unnecessary wakeups when the writer is interrupted by signal/ diff --git a/fs/pipe.c b/fs/pipe.c index b0641f75b1ba..ed55a86ca03b 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -541,12 +541,6 @@ anon_pipe_write(struct kiocb *iocb, struct iov_iter *from) ret = -EAGAIN; break; } - if (signal_pending(current)) { - if (!ret) - ret = -ERESTARTSYS; - break; - } - /* * We're going to release the pipe lock and wait for more * space. We wake up any readers if necessary, and then @@ -554,10 +548,11 @@ anon_pipe_write(struct kiocb *iocb, struct iov_iter *from) * become empty while we dropped the lock. */ mutex_unlock(&pipe->mutex); - if (was_empty) + if (was_empty || pipe->poll_usage) wake_up_interruptible_sync_poll(&pipe->rd_wait, EPOLLIN | EPOLLRDNORM); kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); - wait_event_interruptible_exclusive(pipe->wr_wait, pipe_writable(pipe)); + if (wait_event_interruptible_exclusive(pipe->wr_wait, pipe_writable(pipe)) < 0) + return ret ?: -ERESTARTSYS; mutex_lock(&pipe->mutex); was_empty = pipe_empty(pipe->head, pipe->tail); wake_next_writer = true;