cfq-iosched: Take care of corner cases of group losing share due to deletion
authorVivek Goyal <vgoyal@redhat.com>
Tue, 8 Dec 2009 22:52:58 +0000 (17:52 -0500)
committerJens Axboe <jens.axboe@oracle.com>
Wed, 9 Dec 2009 14:11:04 +0000 (15:11 +0100)
commit7667aa0630407bc07dc38dcc79d29cc0a65553c1
treecd9007b2dfebec215d955952ea0f9914490bddaa
parentc244bb50a9baa2ec47a458bbafb36b5e559ed5fa
cfq-iosched: Take care of corner cases of group losing share due to deletion

If there is a sequential reader running in a group, we wait for next request
to come in that group after slice expiry and once new request is in, we expire
the queue. Otherwise we delete the group from service tree and group looses
its fair share.

So far I was marking a queue as wait_busy if it had consumed its slice and
it was last queue in the group. But this condition did not cover following
two cases.

1.If a request completed and slice has not expired yet. Next request comes
  in and is dispatched to disk. Now select_queue() hits and slice has expired.
  This group will be deleted. Because request is still in the disk, this queue
  will never get a chance to wait_busy.

2.If request completed and slice has not expired yet. Before next request
  comes in (delay due to think time), select_queue() hits and expires the
  queue hence group. This queue never got a chance to wait busy.

Gui was hitting the boundary condition 1 and not getting fairness numbers
proportional to weight.

This patch puts the checks for above two conditions and improves the fairness
numbers for sequential workload on rotational media. Check in select_queue()
takes care of case 1 and additional check in should_wait_busy() takes care
of case 2.

Reported-by: Gui Jianfeng <guijianfeng@cn.fujitsu.com>
Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/cfq-iosched.c