Commit 8446487f authored by David Howells's avatar David Howells
Browse files

pipe: Conditionalise wakeup in pipe_read()



Only do a wakeup in pipe_read() if we made space in a completely full
buffer.  The producer shouldn't be waiting on pipe->wait otherwise.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent b667b867
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -328,10 +328,12 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to)
				spin_lock_irq(&pipe->wait.lock);
				tail++;
				pipe->tail = tail;
				do_wakeup = 0;
				do_wakeup = 1;
				if (head - (tail - 1) == pipe->max_usage)
					wake_up_interruptible_sync_poll_locked(
						&pipe->wait, EPOLLOUT | EPOLLWRNORM);
				spin_unlock_irq(&pipe->wait.lock);
				if (head - (tail - 1) == pipe->max_usage)
					kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
			}
			total_len -= chars;
@@ -361,11 +363,6 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to)
				ret = -ERESTARTSYS;
			break;
		}
		if (do_wakeup) {
			wake_up_interruptible_sync_poll(&pipe->wait, EPOLLOUT | EPOLLWRNORM);
 			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
			do_wakeup = 0;
		}
		pipe_wait(pipe);
	}
	__pipe_unlock(pipe);