On Mon, Dec 17, 2018 at 08:44:42AM +0100, Christoph Hellwig wrote:
> I suspect we want something like this to make sure we never look
> at queue maps that don't have nr_queues set, and then just don't
> have to initialize them in nvme:
>
> diff --git a/block/blk-mq.h b/block/blk-mq.h
> index b63a0de8a07a..d1ed096723fb 100644
> --- a/block/blk-mq.h
> +++ b/block/blk-mq.h
> @@ -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);
> }
>
> diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
> index fb9d8270f32c..698b350b38cf 100644
> --- a/drivers/nvme/host/pci.c
> +++ b/drivers/nvme/host/pci.c
> @@ -496,11 +496,7 @@ static int nvme_pci_map_queues(struct blk_mq_tag_set
> *set)
> map->nr_queues = dev->io_queues[i];
> if (!map->nr_queues) {
> BUG_ON(i == HCTX_TYPE_DEFAULT);
> -
> - /* shared set, resuse read set parameters */
> - map->nr_queues = dev->io_queues[HCTX_TYPE_DEFAULT];
> - qoff = 0;
> - offset = queue_irq_offset(dev);
> + continue;
> }
>
> /*
This way works just with a bit cost in blk_mq_map_queue(), given
we have cached hctx in rq->mq_hctx, I think this approach is good.
Thanks,
Ming