blk-mq: only dispatch to non-defauly queue maps if they have queues
authorChristoph Hellwig <hch@lst.de>
Mon, 17 Dec 2018 11:16:26 +0000 (12:16 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 17 Dec 2018 12:44:45 +0000 (05:44 -0700)
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 <ming.lei@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.h

index b63a0de8a07a3272633c49a95ded223369cfae47..d1ed096723fb057a6223abd922c32bfba6a5362f 100644 (file)
@@ -105,14 +105,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);
 }