blk-mq: refactor blk_mq_sched_assign_ioc
blk_mq_sched_assign_ioc now only handles the assigned of the ioc if
the schedule needs it (bfq only at the moment). The caller to the
per-request initializer is moved out so that it can be merged with
a similar call for the kyber I/O scheduler.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/block/blk-mq.c b/block/blk-mq.c
index e056725..2f380ab 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -315,8 +315,18 @@ static struct request *blk_mq_get_request(struct request_queue *q,
if (!op_is_flush(op)) {
rq->elv.icq = NULL;
- if (e && e->type->icq_cache)
- blk_mq_sched_assign_ioc(q, rq, bio);
+ if (e && e->type->ops.mq.get_rq_priv) {
+ if (e->type->icq_cache && rq_ioc(bio))
+ blk_mq_sched_assign_ioc(rq, bio);
+
+ if (e->type->ops.mq.get_rq_priv(q, rq, bio)) {
+ if (rq->elv.icq)
+ put_io_context(rq->elv.icq->ioc);
+ rq->elv.icq = NULL;
+ } else {
+ rq->rq_flags |= RQF_ELVPRIV;
+ }
+ }
}
data->hctx->queued++;
return rq;