The following commit has been merged in the linux branch: commit 355b659c87432a4e76160640625c47fcf9174e8d Author: Corrado Zoccolo czoccolo@gmail.com Date: Thu Oct 8 08:43:32 2009 +0200
cfq-iosched: avoid probable slice overrun when idling
If the average think time is larger than the remaining time slice for any given queue, don't allow it to idle. A succesful idle also means that we need to dispatch and complete a request, so if we don't even have time left for the idle process, we would overrun the slice in any case.
Signed-off-by: Corrado Zoccolo czoccolo@gmail.com Signed-off-by: Jens Axboe jens.axboe@oracle.com
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index a592afc..069a610 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c @@ -1093,6 +1093,15 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd) if (!cic || !atomic_read(&cic->ioc->nr_tasks)) return;
+ /* + * If our average think time is larger than the remaining time + * slice, then don't idle. This avoids overrunning the allotted + * time slice. + */ + if (sample_valid(cic->ttime_samples) && + (cfqq->slice_end - jiffies < cic->ttime_mean)) + return; + cfq_mark_cfqq_wait_request(cfqq);
/*