Re: [PATCH 09/14] blk-mq: ensure that plug lists don't straddle hardware queues
From: Bart Van Assche <bvanassche@acm.org>
Date: 2018-10-29 19:28:03
Also in:
linux-scsi, lkml
On Mon, 2018-10-29 at 10:37 -0600, Jens Axboe wrote:
quoted hunk ↗ jump to hunk
void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) { struct blk_mq_ctx *this_ctx;@@ -1628,7 +1649,7 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) struct request *rq; LIST_HEAD(list); LIST_HEAD(ctx_list); - unsigned int depth; + unsigned int depth, this_flags; list_splice_init(&plug->mq_list, &list);@@ -1636,13 +1657,14 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) this_q = NULL; this_ctx = NULL; + this_flags = 0; depth = 0; while (!list_empty(&list)) { rq = list_entry_rq(list.next); list_del_init(&rq->queuelist); BUG_ON(!rq->q); - if (rq->mq_ctx != this_ctx) { + if (!ctx_match(rq, this_ctx, this_flags)) { if (this_ctx) { trace_block_unplug(this_q, depth, !from_schedule); blk_mq_sched_insert_requests(this_q, this_ctx,@@ -1650,6 +1672,7 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) from_schedule); } + this_flags = rq->cmd_flags; this_ctx = rq->mq_ctx; this_q = rq->q; depth = 0;
This patch will cause the function stored in the flags_to_type pointer to be called 2 * (n - 1) times where n is the number of elements in 'list' when blk_mq_sched_insert_requests() is called. Have you considered to rearrange the code such that that number of calls is reduced to n? Thanks, Bart.