Hannes Reinecke e22297
From: Bart Van Assche <bvanassche@acm.org>
Hannes Reinecke e22297
Date: Thu, 13 May 2021 10:15:29 -0700
Hannes Reinecke e22297
Subject: [PATCH] blk-mq: Swap two calls in blk_mq_exit_queue()
Hannes Reinecke e22297
Git-commit: 630ef623ed26c18a457cdc070cf24014e50129c2
Hannes Reinecke e22297
Patch-mainline: v5.13-rc2
Hannes Reinecke e22297
References: git-fixes
Hannes Reinecke e22297
Hannes Reinecke e22297
If a tag set is shared across request queues (e.g. SCSI LUNs) then the
Hannes Reinecke e22297
block layer core keeps track of the number of active request queues in
Hannes Reinecke e22297
tags->active_queues. blk_mq_tag_busy() and blk_mq_tag_idle() update that
Hannes Reinecke e22297
atomic counter if the hctx flag BLK_MQ_F_TAG_QUEUE_SHARED is set. Make
Hannes Reinecke e22297
sure that blk_mq_exit_queue() calls blk_mq_tag_idle() before that flag is
Hannes Reinecke e22297
cleared by blk_mq_del_queue_tag_set().
Hannes Reinecke e22297
Hannes Reinecke e22297
Cc: Christoph Hellwig <hch@infradead.org>
Hannes Reinecke e22297
Cc: Ming Lei <ming.lei@redhat.com>
Hannes Reinecke e22297
Cc: Hannes Reinecke <hare@suse.com>
Hannes Reinecke e22297
Fixes: 0d2602ca30e4 ("blk-mq: improve support for shared tags maps")
Hannes Reinecke e22297
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Hannes Reinecke e22297
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Hannes Reinecke e22297
Link: https://lore.kernel.org/r/20210513171529.7977-1-bvanassche@acm.org
Hannes Reinecke e22297
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Hannes Reinecke e22297
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke e22297
---
Hannes Reinecke e22297
 block/blk-mq.c | 6 ++++--
Hannes Reinecke e22297
 1 file changed, 4 insertions(+), 2 deletions(-)
Hannes Reinecke e22297
Hannes Reinecke e22297
diff --git a/block/blk-mq.c b/block/blk-mq.c
Hannes Reinecke e22297
index 28ef0248efba..c86c01bfecdb 100644
Hannes Reinecke e22297
--- a/block/blk-mq.c
Hannes Reinecke e22297
+++ b/block/blk-mq.c
Hannes Reinecke e22297
@@ -3286,10 +3286,12 @@ EXPORT_SYMBOL(blk_mq_init_allocated_queue);
Hannes Reinecke e22297
 /* tags can _not_ be used after returning from blk_mq_exit_queue */
Hannes Reinecke e22297
 void blk_mq_exit_queue(struct request_queue *q)
Hannes Reinecke e22297
 {
Hannes Reinecke e22297
-	struct blk_mq_tag_set	*set = q->tag_set;
Hannes Reinecke e22297
+	struct blk_mq_tag_set *set = q->tag_set;
Hannes Reinecke e22297
 
Hannes Reinecke e22297
-	blk_mq_del_queue_tag_set(q);
Hannes Reinecke e22297
+	/* Checks hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED. */
Hannes Reinecke e22297
 	blk_mq_exit_hw_queues(q, set, set->nr_hw_queues);
Hannes Reinecke e22297
+	/* May clear BLK_MQ_F_TAG_QUEUE_SHARED in hctx->flags. */
Hannes Reinecke e22297
+	blk_mq_del_queue_tag_set(q);
Hannes Reinecke e22297
 }
Hannes Reinecke e22297
 
Hannes Reinecke e22297
 static int __blk_mq_alloc_rq_maps(struct blk_mq_tag_set *set)
Hannes Reinecke e22297
-- 
Hannes Reinecke e22297
2.29.2
Hannes Reinecke e22297