blk-mq-sched: change ->dispatch_requests() to ->dispatch_request()

When we invoke dispatch_requests(), the scheduler empties everything
into the passed in list. This isn't always a good thing, since it
means that we remove items that we could have potentially merged
with.

Change the function to dispatch single requests at the time. If
we do that, we can backoff exactly at the point where the device
can't consume more IO, and leave the rest with the scheduler for
better merging and future dispatch decision making.

Signed-off-by: Jens Axboe <[email protected]>
Reviewed-by: Omar Sandoval <[email protected]>
Tested-by: Hannes Reinecke <[email protected]>
This commit is contained in:
Jens Axboe 2017-01-26 12:40:07 -07:00
commit c13660a08c
4 changed files with 23 additions and 14 deletions

View file

@ -287,14 +287,16 @@ done:
return rq;
}
static void dd_dispatch_requests(struct blk_mq_hw_ctx *hctx,
struct list_head *rq_list)
static struct request *dd_dispatch_request(struct blk_mq_hw_ctx *hctx)
{
struct deadline_data *dd = hctx->queue->elevator->elevator_data;
struct request *rq;
spin_lock(&dd->lock);
blk_mq_sched_move_to_dispatch(hctx, rq_list, __dd_dispatch_request);
rq = __dd_dispatch_request(hctx);
spin_unlock(&dd->lock);
return rq;
}
static void dd_exit_queue(struct elevator_queue *e)
@ -517,7 +519,7 @@ static struct elv_fs_entry deadline_attrs[] = {
static struct elevator_type mq_deadline = {
.ops.mq = {
.insert_requests = dd_insert_requests,
.dispatch_requests = dd_dispatch_requests,
.dispatch_request = dd_dispatch_request,
.next_request = elv_rb_latter_request,
.former_request = elv_rb_former_request,
.bio_merge = dd_bio_merge,