[PATCH] splice: only call wake_up_interruptible() when we really have to
__wake_up_common() is pretty heavy in the kernel profiles, this brings it down to a more acceptable level. Signed-off-by: Jens Axboe <axboe@suse.de>
This commit is contained in:
parent
9aefe431f5
commit
c0bd1f650b
1 changed files with 12 additions and 4 deletions
16
fs/splice.c
16
fs/splice.c
|
@ -187,7 +187,9 @@ static ssize_t move_to_pipe(struct inode *inode, struct page **pages,
|
|||
}
|
||||
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible_sync(PIPE_WAIT(*inode));
|
||||
smp_mb();
|
||||
if (waitqueue_active(PIPE_WAIT(*inode)))
|
||||
wake_up_interruptible_sync(PIPE_WAIT(*inode));
|
||||
kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO,
|
||||
POLL_IN);
|
||||
do_wakeup = 0;
|
||||
|
@ -201,7 +203,9 @@ static ssize_t move_to_pipe(struct inode *inode, struct page **pages,
|
|||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible(PIPE_WAIT(*inode));
|
||||
smp_mb();
|
||||
if (waitqueue_active(PIPE_WAIT(*inode)))
|
||||
wake_up_interruptible(PIPE_WAIT(*inode));
|
||||
kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN);
|
||||
}
|
||||
|
||||
|
@ -600,7 +604,9 @@ static ssize_t move_from_pipe(struct inode *inode, struct file *out,
|
|||
}
|
||||
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible_sync(PIPE_WAIT(*inode));
|
||||
smp_mb();
|
||||
if (waitqueue_active(PIPE_WAIT(*inode)))
|
||||
wake_up_interruptible_sync(PIPE_WAIT(*inode));
|
||||
kill_fasync(PIPE_FASYNC_WRITERS(*inode),SIGIO,POLL_OUT);
|
||||
do_wakeup = 0;
|
||||
}
|
||||
|
@ -611,7 +617,9 @@ static ssize_t move_from_pipe(struct inode *inode, struct file *out,
|
|||
mutex_unlock(PIPE_MUTEX(*inode));
|
||||
|
||||
if (do_wakeup) {
|
||||
wake_up_interruptible(PIPE_WAIT(*inode));
|
||||
smp_mb();
|
||||
if (waitqueue_active(PIPE_WAIT(*inode)))
|
||||
wake_up_interruptible(PIPE_WAIT(*inode));
|
||||
kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue