mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-11-10 19:39:54 +01:00
pipe: use event aware wakeups
Send the events the wakeup refers to, so that epoll, and even the new poll code in fs/select.c can avoid wakeups if the events do not match the requested set. Signed-off-by: Davide Libenzi <[email protected]> Acked-by: David S. Miller <[email protected]> Acked-by: Eric Dumazet <[email protected]> Cc: Jens Axboe <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
5f829e405e
commit
e462c448fd
1 file changed
+5
-5
@@ -441,7 +441,7 @@ redo:
|
||||
break;
|
||||
}
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible_sync(&pipe->wait);
|
||||
wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT);
|
||||
kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
|
||||
}
|
||||
pipe_wait(pipe);
|
||||
@@ -450,7 +450,7 @@ redo:
|
||||
|
||||
/* Signal writers asynchronously that there is more room. */
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible_sync(&pipe->wait);
|
||||
wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT);
|
||||
kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
|
||||
}
|
||||
if (ret > 0)
|
||||
@@ -612,7 +612,7 @@ redo2:
|
||||
break;
|
||||
}
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible_sync(&pipe->wait);
|
||||
wake_up_interruptible_sync_poll(&pipe->wait, POLLIN);
|
||||
kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
|
||||
do_wakeup = 0;
|
||||
}
|
||||
@@ -623,7 +623,7 @@ redo2:
|
||||
out:
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible_sync(&pipe->wait);
|
||||
wake_up_interruptible_sync_poll(&pipe->wait, POLLIN);
|
||||
kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
|
||||
}
|
||||
if (ret > 0)
|
||||
@@ -715,7 +715,7 @@ pipe_release(struct inode *inode, int decr, int decw)
|
||||
if (!pipe->readers && !pipe->writers) {
|
||||
free_pipe_info(inode);
|
||||
} else {
|
||||
wake_up_interruptible_sync(&pipe->wait);
|
||||
wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT);
|
||||
kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
|
||||
kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user