aboutsummaryrefslogtreecommitdiffstats
path: root/block/cfq-iosched.c
diff options
context:
space:
mode:
authorShaohua Li <shaohua.li@intel.com>2010-11-08 09:01:04 -0500
committerJens Axboe <jaxboe@fusionio.com>2010-11-08 09:01:04 -0500
commit8e1ac6655104bc6e1e79d67e2df88cc8fa9b6e07 (patch)
tree2ba1aadf339af7d69931151e9d51f8054753ff85 /block/cfq-iosched.c
parentd2d59e18a1ea8ecdd1c0a52af320e9a7f5391cc4 (diff)
cfq-iosched: don't idle if a deep seek queue is slow
If a deep seek queue slowly deliver requests but disk is much faster, idle for the queue just wastes disk throughput. If the queue delevers all requests before half its slice is used, the patch disable idle for it. In my test, application delivers 32 requests one time, the disk can accept 128 requests at maxium and disk is fast. without the patch, the throughput is just around 30m/s, while with it, the speed is about 80m/s. The disk is a SSD, but is detected as a rotational disk. I can configure it as SSD, but I thought the deep seek queue logic should be fixed too, for example, considering a fast raid. Signed-off-by: Shaohua Li <shaohua.li@intel.com> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'block/cfq-iosched.c')
-rw-r--r--block/cfq-iosched.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 986865e3fbc5..ca4d19907243 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -2285,6 +2285,17 @@ static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd)
2285 goto keep_queue; 2285 goto keep_queue;
2286 } 2286 }
2287 2287
2288 /*
2289 * This is a deep seek queue, but the device is much faster than
2290 * the queue can deliver, don't idle
2291 **/
2292 if (CFQQ_SEEKY(cfqq) && cfq_cfqq_idle_window(cfqq) &&
2293 (cfq_cfqq_slice_new(cfqq) ||
2294 (cfqq->slice_end - jiffies > jiffies - cfqq->slice_start))) {
2295 cfq_clear_cfqq_deep(cfqq);
2296 cfq_clear_cfqq_idle_window(cfqq);
2297 }
2298
2288 if (cfqq->dispatched && cfq_should_idle(cfqd, cfqq)) { 2299 if (cfqq->dispatched && cfq_should_idle(cfqd, cfqq)) {
2289 cfqq = NULL; 2300 cfqq = NULL;
2290 goto keep_queue; 2301 goto keep_queue;