aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorShaohua Li <shaohua.li@intel.com>2010-11-08 15:01:04 +0100
committerJens Axboe <jaxboe@fusionio.com>2010-11-08 15:01:04 +0100
commit8e1ac6655104bc6e1e79d67e2df88cc8fa9b6e07 (patch)
tree2ba1aadf339af7d69931151e9d51f8054753ff85 /block
parentd2d59e18a1ea8ecdd1c0a52af320e9a7f5391cc4 (diff)
downloadkernel_samsung_smdk4412-8e1ac6655104bc6e1e79d67e2df88cc8fa9b6e07.zip
kernel_samsung_smdk4412-8e1ac6655104bc6e1e79d67e2df88cc8fa9b6e07.tar.gz
kernel_samsung_smdk4412-8e1ac6655104bc6e1e79d67e2df88cc8fa9b6e07.tar.bz2
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')
-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 986865e..ca4d199 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)
goto keep_queue;
}
+ /*
+ * This is a deep seek queue, but the device is much faster than
+ * the queue can deliver, don't idle
+ **/
+ if (CFQQ_SEEKY(cfqq) && cfq_cfqq_idle_window(cfqq) &&
+ (cfq_cfqq_slice_new(cfqq) ||
+ (cfqq->slice_end - jiffies > jiffies - cfqq->slice_start))) {
+ cfq_clear_cfqq_deep(cfqq);
+ cfq_clear_cfqq_idle_window(cfqq);
+ }
+
if (cfqq->dispatched && cfq_should_idle(cfqd, cfqq)) {
cfqq = NULL;
goto keep_queue;