diff options
author | 2009-04-15 12:12:46 +0200 | |
---|---|---|
committer | 2009-04-15 12:12:46 +0200 | |
commit | 2d870722965211de072bb36b446a4df99dae07e1 (patch) | |
tree | e9b884d9969157f87e6a88a0de147af4022301e5 | |
parent | cfq-iosched: no need to save interrupts in cfq_kick_queue() (diff) | |
download | linux-2d870722965211de072bb36b446a4df99dae07e1.tar.gz linux-2d870722965211de072bb36b446a4df99dae07e1.tar.bz2 linux-2d870722965211de072bb36b446a4df99dae07e1.zip |
cfq-iosched: tweak kick logic a bit more
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>
-rw-r--r-- | block/cfq-iosched.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index e59f2108272f..579f31822469 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -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); } |