Messages in this thread Patch in this message | | | From | Corrado Zoccolo <> | Subject | [PATCH] cfq: enable idle for seeky processes on rotational NCQ devices | Date | Sun, 4 Oct 2009 18:37:34 +0200 |
| |
Disabled idle window cause large latencies when seeky processes are competing with async writes, for rotational NCQ devices.
This patch, based on Vivek Goyal's original idea (http://lkml.org/lkml/2009/7/12/110), unconditionally enables idle window for seeky processes on rotational NCQ devices. As for non-NCQ devices, a smaller idle window (2ms) is used for seeky processes compared to normal I/O (8ms).
RAIDs should be marked as non-rotational as well (and probably a better flag name should be devised), since they can carry multiple operations in parallel.
Signed-off-by: Corrado Zoccolo <czoccolo@gmail.com> --- diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index ebab60c..576e92d 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -1981,10 +1981,14 @@ cfq_update_idle_window(struct cfq_data *cfqd, struct cfq_queue *cfqq, enable_idle = old_idle = cfq_cfqq_idle_window(cfqq); if (!atomic_read(&cic->ioc->nr_tasks) || !cfqd->cfq_slice_idle || - (!cfqd->cfq_latency && cfqd->hw_tag && CIC_SEEKY(cic))) + (blk_queue_nonrot(cfqd->queue) && cfqd->hw_tag && CIC_SEEKY(cic))) enable_idle = 0; else if (sample_valid(cic->ttime_samples)) { - if (cic->ttime_mean > cfqd->cfq_slice_idle) + unsigned idle_time = cfqd->cfq_slice_idle; + if (CIC_SEEKY(cic)) + idle_time = CFQ_MIN_TT; + + if (cic->ttime_mean > idle_time) enable_idle = 0; else enable_idle = 1;
| |