[PATCH] cfq-iosched: check busy queues before deciding we are idle
authorJens Axboe <axboe@suse.de>
Thu, 1 Jun 2006 08:07:26 +0000 (10:07 +0200)
committerJens Axboe <axboe@suse.de>
Thu, 1 Jun 2006 08:07:26 +0000 (10:07 +0200)
For just one busy queue (like async write out), we often overlooked
that we could queue more io and decided we were idle instead. This causes
us quite a bit of performance loss.

Signed-off-by: Jens Axboe <axboe@suse.de>
block/cfq-iosched.c

index 11ce6aaf1bd02fdc8063f46566ecfeb2ff389159..d582433441c502f31d238ee2fc974287e2ec5adb 100644 (file)
@@ -878,6 +878,13 @@ static struct cfq_queue *cfq_set_active_queue(struct cfq_data *cfqd)
        if (!list_empty(&cfqd->cur_rr) || cfq_get_next_prio_level(cfqd) != -1)
                cfqq = list_entry_cfqq(cfqd->cur_rr.next);
 
+       /*
+        * If no new queues are available, check if the busy list has some
+        * before falling back to idle io.
+        */
+       if (!cfqq && !list_empty(&cfqd->busy_rr))
+               cfqq = list_entry_cfqq(cfqd->busy_rr.next);
+
        /*
         * if we have idle queues and no rt or be queues had pending
         * requests, either allow immediate service if the grace period