cfq-iosched: fairness for sync no-idle queues
authorCorrado Zoccolo <czoccolo@gmail.com>
Mon, 26 Oct 2009 21:45:29 +0000 (22:45 +0100)
committerJens Axboe <jens.axboe@oracle.com>
Wed, 28 Oct 2009 08:23:26 +0000 (09:23 +0100)
commit718eee0579b802aabe3bafacf09d0a9b0830f1dd
tree3a85a6d38ed7b68ed6ca21d04158afee13980e5e
parenta6d44e982d3734583b3b4e1d36921af8cfd61fc0
cfq-iosched: fairness for sync no-idle queues

Currently no-idle queues in cfq are not serviced fairly:
even if they can only dispatch a small number of requests at a time,
they have to compete with idling queues to be serviced, experiencing
large latencies.

We should notice, instead, that no-idle queues are the ones that would
benefit most from having low latency, in fact they are any of:
* processes with large think times (e.g. interactive ones like file
  managers)
* seeky (e.g. programs faulting in their code at startup)
* or marked as no-idle from upper levels, to improve latencies of those
  requests.

This patch improves the fairness and latency for those queues, by:
* separating sync idle, sync no-idle and async queues in separate
  service_trees, for each priority
* service all no-idle queues together
* and idling when the last no-idle queue has been serviced, to
  anticipate for more no-idle work
* the timeslices allotted for idle and no-idle service_trees are
  computed proportionally to the number of processes in each set.

Servicing all no-idle queues together should have a performance boost
for NCQ-capable drives, without compromising fairness.

Signed-off-by: Corrado Zoccolo <czoccolo@gmail.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/cfq-iosched.c