Deadline iosched: Fix batching fairness
After switching data directions, deadline always starts the next batch from the lowest-sector request. This gives excessive deadline expiries and large latency and throughput disparity between high- and low-sector requests; an order of magnitude in some tests. This patch changes the batching behaviour so new batches start from the request whose expiry is earliest. Signed-off-by: Aaron Carroll <aaronc@gelato.unsw.edu.au> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
dfb3d72a9a
commit
6f5d8aa638
|
@ -306,27 +306,20 @@ static int deadline_dispatch_requests(struct request_queue *q, int force)
|
|||
dispatch_find_request:
|
||||
/*
|
||||
* we are not running a batch, find best request for selected data_dir
|
||||
* and start a new batch
|
||||
*/
|
||||
if (deadline_check_fifo(dd, data_dir)) {
|
||||
/* An expired request exists - satisfy it */
|
||||
if (deadline_check_fifo(dd, data_dir) || !dd->next_rq[data_dir]) {
|
||||
/*
|
||||
* A deadline has expired, the last request was in the other
|
||||
* direction, or we have run out of higher-sectored requests.
|
||||
* Start again from the request with the earliest expiry time.
|
||||
*/
|
||||
rq = rq_entry_fifo(dd->fifo_list[data_dir].next);
|
||||
} else if (dd->next_rq[data_dir]) {
|
||||
} else {
|
||||
/*
|
||||
* The last req was the same dir and we have a next request in
|
||||
* sort order. No expired requests so continue on from here.
|
||||
*/
|
||||
rq = dd->next_rq[data_dir];
|
||||
} else {
|
||||
struct rb_node *node;
|
||||
/*
|
||||
* The last req was the other direction or we have run out of
|
||||
* higher-sectored requests. Go back to the lowest sectored
|
||||
* request (1 way elevator) and start a new batch.
|
||||
*/
|
||||
node = rb_first(&dd->sort_list[data_dir]);
|
||||
if (node)
|
||||
rq = rb_entry_rq(node);
|
||||
}
|
||||
|
||||
dd->batching = 0;
|
||||
|
|
Loading…
Reference in New Issue
Block a user