From 0d7b3c300730720bbfe31ed2cedb9789f95516a5 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Mon, 17 Dec 2018 12:16:26 +0100 Subject: [PATCH 1784/2944] blk-mq: only dispatch to non-defauly queue maps if they have queues to #28991349 commit 5aceaeb26394538858a9dbae5830d628469a44cf upstream We should check if a given queue map actually has queues enabled before dispatching to it. This allows drivers to not initialize optional but not used map types, which subsequently will allow fixing problems with queue map rebuilds for that case. Reviewed-by: Ming Lei Signed-off-by: Christoph Hellwig Signed-off-by: Jens Axboe Signed-off-by: Xiaoguang Wang Reviewed-by: Joseph Qi --- block/blk-mq.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/block/blk-mq.h b/block/blk-mq.h index 033f20eb..3a8cb05 100644 --- a/block/blk-mq.h +++ b/block/blk-mq.h @@ -103,14 +103,17 @@ static inline struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *q, { enum hctx_type type = HCTX_TYPE_DEFAULT; - if (q->tag_set->nr_maps > HCTX_TYPE_POLL && - ((flags & REQ_HIPRI) && test_bit(QUEUE_FLAG_POLL, &q->queue_flags))) + if ((flags & REQ_HIPRI) && + q->tag_set->nr_maps > HCTX_TYPE_POLL && + q->tag_set->map[HCTX_TYPE_POLL].nr_queues && + test_bit(QUEUE_FLAG_POLL, &q->queue_flags)) type = HCTX_TYPE_POLL; - else if (q->tag_set->nr_maps > HCTX_TYPE_READ && - ((flags & REQ_OP_MASK) == REQ_OP_READ)) + else if (((flags & REQ_OP_MASK) == REQ_OP_READ) && + q->tag_set->nr_maps > HCTX_TYPE_READ && + q->tag_set->map[HCTX_TYPE_READ].nr_queues) type = HCTX_TYPE_READ; - + return blk_mq_map_queue_type(q, type, cpu); } -- 1.8.3.1