diff options
author | David Howells <dhowells@redhat.com> | 2019-10-31 15:59:24 +0000 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2019-11-15 16:22:54 +0000 |
commit | cefa80ced57a29179313da7ab3cbb26afb040b6f (patch) | |
tree | ff53c378d7ba72dcd451334b331a4359ec96e77e /fs/pipe.c | |
parent | 8df441294dd34fb0b16b45f550f55e96db6af4dc (diff) | |
download | linux-stable-cefa80ced57a29179313da7ab3cbb26afb040b6f.tar.gz linux-stable-cefa80ced57a29179313da7ab3cbb26afb040b6f.tar.bz2 linux-stable-cefa80ced57a29179313da7ab3cbb26afb040b6f.zip |
pipe: Increase the writer-wakeup threshold to reduce context-switch count
Increase the threshold at which the reader sends a wake event to the
writers in the queue such that the queue must be half empty before the wake
is issued rather than the wake being issued when just a single slot
available.
This reduces the number of context switches in the tests significantly,
without altering the amount of work achieved. With my pipe-bench program,
there's a 20% reduction versus an unpatched kernel.
Suggested-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/pipe.c')
-rw-r--r-- | fs/pipe.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/pipe.c b/fs/pipe.c index aba2455caabe..9cd5cbef9552 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -324,16 +324,18 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to) } if (!buf->len) { + bool wake; pipe_buf_release(pipe, buf); spin_lock_irq(&pipe->wait.lock); tail++; pipe->tail = tail; do_wakeup = 1; - if (head - (tail - 1) == pipe->max_usage) + wake = head - (tail - 1) == pipe->max_usage / 2; + if (wake) wake_up_interruptible_sync_poll_locked( &pipe->wait, EPOLLOUT | EPOLLWRNORM); spin_unlock_irq(&pipe->wait.lock); - if (head - (tail - 1) == pipe->max_usage) + if (wake) kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); } total_len -= chars; |