提交 239c0d8b 编写于 作者: J Jens Axboe 提交者: Caspar Zhang

blk-mq: cleanup and improve list insertion

to #28991349

commit 67cae4c948a5311121905a2a8740c50daf7f6478 upstream

It's somewhat strange to have a list insertion function that
relies on the fact that the caller has mapped things correctly.
Pass in the hardware queue directly for insertion, which makes
for a much cleaner interface and implementation.
Reviewed-by: NKeith Busch <keith.busch@intel.com>
Reviewed-by: NSagi Grimberg <sagi@grimberg.me>
Reviewed-by: NHannes Reinecke <hare@suse.com>
Signed-off-by: NJens Axboe <axboe@kernel.dk>
Signed-off-by: NXiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
Reviewed-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
上级 107174b9
...@@ -397,17 +397,12 @@ void blk_mq_sched_insert_request(struct request *rq, bool at_head, ...@@ -397,17 +397,12 @@ void blk_mq_sched_insert_request(struct request *rq, bool at_head,
blk_mq_run_hw_queue(hctx, async); blk_mq_run_hw_queue(hctx, async);
} }
void blk_mq_sched_insert_requests(struct request_queue *q, void blk_mq_sched_insert_requests(struct blk_mq_hw_ctx *hctx,
struct blk_mq_ctx *ctx, struct blk_mq_ctx *ctx,
struct list_head *list, bool run_queue_async) struct list_head *list, bool run_queue_async)
{ {
struct blk_mq_hw_ctx *hctx; struct request_queue *q = hctx->queue;
struct elevator_queue *e; struct elevator_queue *e;
struct request *rq;
/* For list inserts, requests better be on the same hw queue */
rq = list_first_entry(list, struct request, queuelist);
hctx = rq->mq_hctx;
/* /*
* blk_mq_sched_insert_requests() is called from flush plug * blk_mq_sched_insert_requests() is called from flush plug
......
...@@ -20,7 +20,7 @@ void blk_mq_sched_restart(struct blk_mq_hw_ctx *hctx); ...@@ -20,7 +20,7 @@ void blk_mq_sched_restart(struct blk_mq_hw_ctx *hctx);
void blk_mq_sched_insert_request(struct request *rq, bool at_head, void blk_mq_sched_insert_request(struct request *rq, bool at_head,
bool run_queue, bool async); bool run_queue, bool async);
void blk_mq_sched_insert_requests(struct request_queue *q, void blk_mq_sched_insert_requests(struct blk_mq_hw_ctx *hctx,
struct blk_mq_ctx *ctx, struct blk_mq_ctx *ctx,
struct list_head *list, bool run_queue_async); struct list_head *list, bool run_queue_async);
......
...@@ -1669,11 +1669,12 @@ static int plug_ctx_cmp(void *priv, struct list_head *a, struct list_head *b) ...@@ -1669,11 +1669,12 @@ static int plug_ctx_cmp(void *priv, struct list_head *a, struct list_head *b)
void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule)
{ {
struct blk_mq_hw_ctx *this_hctx;
struct blk_mq_ctx *this_ctx; struct blk_mq_ctx *this_ctx;
struct request_queue *this_q; struct request_queue *this_q;
struct request *rq; struct request *rq;
LIST_HEAD(list); LIST_HEAD(list);
LIST_HEAD(ctx_list); LIST_HEAD(rq_list);
unsigned int depth; unsigned int depth;
list_splice_init(&plug->mq_list, &list); list_splice_init(&plug->mq_list, &list);
...@@ -1682,6 +1683,7 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) ...@@ -1682,6 +1683,7 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule)
list_sort(NULL, &list, plug_ctx_cmp); list_sort(NULL, &list, plug_ctx_cmp);
this_q = NULL; this_q = NULL;
this_hctx = NULL;
this_ctx = NULL; this_ctx = NULL;
depth = 0; depth = 0;
...@@ -1689,30 +1691,31 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) ...@@ -1689,30 +1691,31 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule)
rq = list_entry_rq(list.next); rq = list_entry_rq(list.next);
list_del_init(&rq->queuelist); list_del_init(&rq->queuelist);
BUG_ON(!rq->q); BUG_ON(!rq->q);
if (rq->mq_ctx != this_ctx) { if (rq->mq_hctx != this_hctx || rq->mq_ctx != this_ctx) {
if (this_ctx) { if (this_hctx) {
trace_block_unplug(this_q, depth, !from_schedule); trace_block_unplug(this_q, depth, !from_schedule);
blk_mq_sched_insert_requests(this_q, this_ctx, blk_mq_sched_insert_requests(this_hctx, this_ctx,
&ctx_list, &rq_list,
from_schedule); from_schedule);
} }
this_ctx = rq->mq_ctx;
this_q = rq->q; this_q = rq->q;
this_ctx = rq->mq_ctx;
this_hctx = rq->mq_hctx;
depth = 0; depth = 0;
} }
depth++; depth++;
list_add_tail(&rq->queuelist, &ctx_list); list_add_tail(&rq->queuelist, &rq_list);
} }
/* /*
* If 'this_ctx' is set, we know we have entries to complete * If 'this_hctx' is set, we know we have entries to complete
* on 'ctx_list'. Do those. * on 'rq_list'. Do those.
*/ */
if (this_ctx) { if (this_hctx) {
trace_block_unplug(this_q, depth, !from_schedule); trace_block_unplug(this_q, depth, !from_schedule);
blk_mq_sched_insert_requests(this_q, this_ctx, &ctx_list, blk_mq_sched_insert_requests(this_hctx, this_ctx, &rq_list,
from_schedule); from_schedule);
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册