[PATCH] splice: only call wake_up_interruptible() when we really have to
authorJens Axboe <axboe@suse.de>
Mon, 10 Apr 2006 07:03:32 +0000 (09:03 +0200)
committerJens Axboe <axboe@suse.de>
Mon, 10 Apr 2006 07:03:32 +0000 (09:03 +0200)
__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>
fs/splice.c

index 26f5f7ecee5c3745e3c0a9475109ecc6afeed2f5..9f796b1034d1328189f9a308955cac9338df2abf 100644 (file)
@@ -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);
        }