blk-mq: reconfigure poll after queue map is changed
authorMing Lei <ming.lei@redhat.com>
Tue, 8 Mar 2022 07:32:16 +0000 (15:32 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 9 Mar 2022 00:57:19 +0000 (17:57 -0700)
queue map can be changed when updating nr_hw_queues, so we need to
reconfigure queue's poll capability. Add one helper for doing this job.

Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/20220308073219.91173-4-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.c

index 64fddb3..57ae9df 100644 (file)
@@ -4010,6 +4010,17 @@ static void blk_mq_realloc_hw_ctxs(struct blk_mq_tag_set *set,
        mutex_unlock(&q->sysfs_lock);
 }
 
+static void blk_mq_update_poll_flag(struct request_queue *q)
+{
+       struct blk_mq_tag_set *set = q->tag_set;
+
+       if (set->nr_maps > HCTX_TYPE_POLL &&
+           set->map[HCTX_TYPE_POLL].nr_queues)
+               blk_queue_flag_set(QUEUE_FLAG_POLL, q);
+       else
+               blk_queue_flag_clear(QUEUE_FLAG_POLL, q);
+}
+
 int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
                struct request_queue *q)
 {
@@ -4044,9 +4055,7 @@ int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
        q->tag_set = set;
 
        q->queue_flags |= QUEUE_FLAG_MQ_DEFAULT;
-       if (set->nr_maps > HCTX_TYPE_POLL &&
-           set->map[HCTX_TYPE_POLL].nr_queues)
-               blk_queue_flag_set(QUEUE_FLAG_POLL, q);
+       blk_mq_update_poll_flag(q);
 
        INIT_DELAYED_WORK(&q->requeue_work, blk_mq_requeue_work);
        INIT_LIST_HEAD(&q->requeue_list);
@@ -4512,6 +4521,7 @@ fallback:
        blk_mq_update_queue_map(set);
        list_for_each_entry(q, &set->tag_list, tag_set_list) {
                blk_mq_realloc_hw_ctxs(set, q);
+               blk_mq_update_poll_flag(q);
                if (q->nr_hw_queues != set->nr_hw_queues) {
                        int i = prev_nr_hw_queues;