Skip to content

Commit

Permalink
mq-deadline: Introduce dispatch helpers
Browse files Browse the repository at this point in the history
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
__dd_dispatch_request() for zoned block devices.

Signed-off-by: Damien Le Moal <[email protected]>
Reviewed-by: Bart Van Assche <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Reviewed-by: Martin K. Petersen <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
damien-lemoal authored and axboe committed Jan 5, 2018
1 parent 6cc77e9 commit bf09ce5
Showing 1 changed file with 37 additions and 8 deletions.
45 changes: 37 additions & 8 deletions block/mq-deadline.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,14 +191,43 @@ static inline int deadline_check_fifo(struct deadline_data *dd, int ddir)
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
* read/write expire, fifo_batch, etc
*/
static struct request *__dd_dispatch_request(struct blk_mq_hw_ctx *hctx)
{
struct deadline_data *dd = hctx->queue->elevator->elevator_data;
struct request *rq;
struct request *rq, *next_rq;
bool reads, writes;
int data_dir;

Expand All @@ -214,10 +243,9 @@ static struct request *__dd_dispatch_request(struct blk_mq_hw_ctx *hctx)
/*
* batches are currently reads XOR writes
*/
if (dd->next_rq[WRITE])
rq = dd->next_rq[WRITE];
else
rq = dd->next_rq[READ];
rq = deadline_next_request(dd, WRITE);
if (!rq)
rq = deadline_next_request(dd, READ);

if (rq && dd->batching < dd->fifo_batch)
/* we have a next request are still entitled to batch */
Expand Down Expand Up @@ -260,19 +288,20 @@ static struct request *__dd_dispatch_request(struct blk_mq_hw_ctx *hctx)
/*
* 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
* 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);
rq = deadline_fifo_request(dd, 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];
rq = next_rq;
}

dd->batching = 0;
Expand Down

0 comments on commit bf09ce5

Please sign in to comment.