cfq-iosched: tweak kick logic a bit more
authorJens Axboe <jens.axboe@oracle.com>
Wed, 15 Apr 2009 10:12:46 +0000 (12:12 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Wed, 15 Apr 2009 10:12:46 +0000 (12:12 +0200)
We only kick the dispatch for an idling queue, if we think it's a
(somewhat) fully merged request. Also allow a kick if we have other
busy queues in the system, since we don't want to risk waiting for
a potential merge in that case. It's better to get some work done and
proceed.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/cfq-iosched.c

index e59f2108272fd1f450297eae347b2e5dbae4a6f1..579f318224693bcb6a68fb4e8e90364dec31f69a 100644 (file)
@@ -1905,10 +1905,13 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
                 * of tiny requests, because we disrupt the normal plugging
                 * and merging. If the request is already larger than a single
                 * page, let it rip immediately. For that case we assume that
-                * merging is already done.
+                * merging is already done. Ditto for a busy system that
+                * has other work pending, don't risk delaying until the
+                * idle timer unplug to continue working.
                 */
                if (cfq_cfqq_wait_request(cfqq)) {
-                       if (blk_rq_bytes(rq) > PAGE_CACHE_SIZE) {
+                       if (blk_rq_bytes(rq) > PAGE_CACHE_SIZE ||
+                           cfqd->busy_queues > 1) {
                                del_timer(&cfqd->idle_slice_timer);
                                blk_start_queueing(cfqd->queue);
                        }