Commit c117bac7 authored by Damien Le Moal's avatar Damien Le Moal Committed by Jens Axboe

deadline-iosched: Introduce dispatch helpers

Avoid directly referencing the next_rq and fifo_list arrays using the
helper functions deadline_next_request() and deadline_fifo_request() to
facilitate changes in the dispatch request selection in
deadline_dispatch_requests() for zoned block devices.

While at it, also remove the unnecessary forward declaration of the
function deadline_move_request().
Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 5700f691
...@@ -50,8 +50,6 @@ struct deadline_data { ...@@ -50,8 +50,6 @@ struct deadline_data {
int front_merges; int front_merges;
}; };
static void deadline_move_request(struct deadline_data *, struct request *);
static inline struct rb_root * static inline struct rb_root *
deadline_rb_root(struct deadline_data *dd, struct request *rq) deadline_rb_root(struct deadline_data *dd, struct request *rq)
{ {
...@@ -230,6 +228,35 @@ static inline int deadline_check_fifo(struct deadline_data *dd, int ddir) ...@@ -230,6 +228,35 @@ static inline int deadline_check_fifo(struct deadline_data *dd, int ddir)
return 0; return 0;
} }
/*
* For the specified data direction, return the next request to dispatch using
* arrival ordered lists.
*/
static struct request *
deadline_fifo_request(struct deadline_data *dd, int data_dir)
{
if (WARN_ON_ONCE(data_dir != READ && data_dir != WRITE))
return NULL;
if (list_empty(&dd->fifo_list[data_dir]))
return NULL;
return rq_entry_fifo(dd->fifo_list[data_dir].next);
}
/*
* For the specified data direction, return the next request to dispatch using
* sector position sorted lists.
*/
static struct request *
deadline_next_request(struct deadline_data *dd, int data_dir)
{
if (WARN_ON_ONCE(data_dir != READ && data_dir != WRITE))
return NULL;
return dd->next_rq[data_dir];
}
/* /*
* deadline_dispatch_requests selects the best request according to * deadline_dispatch_requests selects the best request according to
* read/write expire, fifo_batch, etc * read/write expire, fifo_batch, etc
...@@ -239,16 +266,15 @@ static int deadline_dispatch_requests(struct request_queue *q, int force) ...@@ -239,16 +266,15 @@ static int deadline_dispatch_requests(struct request_queue *q, int force)
struct deadline_data *dd = q->elevator->elevator_data; struct deadline_data *dd = q->elevator->elevator_data;
const int reads = !list_empty(&dd->fifo_list[READ]); const int reads = !list_empty(&dd->fifo_list[READ]);
const int writes = !list_empty(&dd->fifo_list[WRITE]); const int writes = !list_empty(&dd->fifo_list[WRITE]);
struct request *rq; struct request *rq, *next_rq;
int data_dir; int data_dir;
/* /*
* batches are currently reads XOR writes * batches are currently reads XOR writes
*/ */
if (dd->next_rq[WRITE]) rq = deadline_next_request(dd, WRITE);
rq = dd->next_rq[WRITE]; if (!rq)
else rq = deadline_next_request(dd, READ);
rq = dd->next_rq[READ];
if (rq && dd->batching < dd->fifo_batch) if (rq && dd->batching < dd->fifo_batch)
/* we have a next request are still entitled to batch */ /* we have a next request are still entitled to batch */
...@@ -291,19 +317,20 @@ static int deadline_dispatch_requests(struct request_queue *q, int force) ...@@ -291,19 +317,20 @@ static int deadline_dispatch_requests(struct request_queue *q, int force)
/* /*
* we are not running a batch, find best request for selected data_dir * we are not running a batch, find best request for selected data_dir
*/ */
if (deadline_check_fifo(dd, data_dir) || !dd->next_rq[data_dir]) { next_rq = deadline_next_request(dd, data_dir);
if (deadline_check_fifo(dd, data_dir) || !next_rq) {
/* /*
* A deadline has expired, the last request was in the other * A deadline has expired, the last request was in the other
* direction, or we have run out of higher-sectored requests. * direction, or we have run out of higher-sectored requests.
* Start again from the request with the earliest expiry time. * Start again from the request with the earliest expiry time.
*/ */
rq = rq_entry_fifo(dd->fifo_list[data_dir].next); rq = deadline_fifo_request(dd, data_dir);
} else { } else {
/* /*
* The last req was the same dir and we have a next request in * The last req was the same dir and we have a next request in
* sort order. No expired requests so continue on from here. * sort order. No expired requests so continue on from here.
*/ */
rq = dd->next_rq[data_dir]; rq = next_rq;
} }
dd->batching = 0; dd->batching = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment