Pass a queue_limits to blk_mq_init_queue and apply it if non-NULL.  This
will allow allocating queues with valid queue limits instead of setting
the values one at a time later.
Also rename the function to blk_mq_alloc_queue as that is a much better
name for a function that allocates a queue and always pass the queuedata
argument instead of having a separate version for the extra argument.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Reviewed-by: John Garry <john.g.garry@oracle.com>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Link: https://lore.kernel.org/r/20240213073425.1621680-10-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
        blk_mq_sysfs_deinit(q);
 }
 
-static struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,
-               void *queuedata)
+struct request_queue *blk_mq_alloc_queue(struct blk_mq_tag_set *set,
+               struct queue_limits *lim, void *queuedata)
 {
-       struct queue_limits lim = { };
+       struct queue_limits default_lim = { };
        struct request_queue *q;
        int ret;
 
-       q = blk_alloc_queue(&lim, set->numa_node);
+       q = blk_alloc_queue(lim ? lim : &default_lim, set->numa_node);
        if (IS_ERR(q))
                return q;
        q->queuedata = queuedata;
        }
        return q;
 }
-
-struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set)
-{
-       return blk_mq_init_queue_data(set, NULL);
-}
-EXPORT_SYMBOL(blk_mq_init_queue);
+EXPORT_SYMBOL(blk_mq_alloc_queue);
 
 /**
  * blk_mq_destroy_queue - shutdown a request queue
  * @q: request queue to shutdown
  *
- * This shuts down a request queue allocated by blk_mq_init_queue(). All future
+ * This shuts down a request queue allocated by blk_mq_alloc_queue(). All future
  * requests will be failed with -ENODEV. The caller is responsible for dropping
- * the reference from blk_mq_init_queue() by calling blk_put_queue().
+ * the reference from blk_mq_alloc_queue() by calling blk_put_queue().
  *
  * Context: can sleep
  */
        struct request_queue *q;
        struct gendisk *disk;
 
-       q = blk_mq_init_queue_data(set, queuedata);
+       q = blk_mq_alloc_queue(set, NULL, queuedata);
        if (IS_ERR(q))
                return ERR_CAST(q);
 
 
        if (blk_mq_alloc_tag_set(set))
                goto out_tag_set;
 
-       q = blk_mq_init_queue(set);
+       q = blk_mq_alloc_queue(set, NULL, NULL);
        if (IS_ERR(q)) {
                ret = PTR_ERR(q);
                goto out_queue;
 
                goto put_dev;
        }
 
-       anv->ctrl.admin_q = blk_mq_init_queue(&anv->admin_tagset);
+       anv->ctrl.admin_q = blk_mq_alloc_queue(&anv->admin_tagset, NULL, NULL);
        if (IS_ERR(anv->ctrl.admin_q)) {
                ret = -ENOMEM;
                goto put_dev;
 
        if (ret)
                return ret;
 
-       ctrl->admin_q = blk_mq_init_queue(set);
+       ctrl->admin_q = blk_mq_alloc_queue(set, NULL, NULL);
        if (IS_ERR(ctrl->admin_q)) {
                ret = PTR_ERR(ctrl->admin_q);
                goto out_free_tagset;
        }
 
        if (ctrl->ops->flags & NVME_F_FABRICS) {
-               ctrl->fabrics_q = blk_mq_init_queue(set);
+               ctrl->fabrics_q = blk_mq_alloc_queue(set, NULL, NULL);
                if (IS_ERR(ctrl->fabrics_q)) {
                        ret = PTR_ERR(ctrl->fabrics_q);
                        goto out_cleanup_admin_q;
                return ret;
 
        if (ctrl->ops->flags & NVME_F_FABRICS) {
-               ctrl->connect_q = blk_mq_init_queue(set);
+               ctrl->connect_q = blk_mq_alloc_queue(set, NULL, NULL);
                if (IS_ERR(ctrl->connect_q)) {
                        ret = PTR_ERR(ctrl->connect_q);
                        goto out_free_tag_set;
 
 
        sdev->sg_reserved_size = INT_MAX;
 
-       q = blk_mq_init_queue(&sdev->host->tag_set);
+       q = blk_mq_alloc_queue(&sdev->host->tag_set, NULL, NULL);
        if (IS_ERR(q)) {
                /* release fn is set up in scsi_sysfs_device_initialise, so
                 * have to free and put manually here */
 
        err = blk_mq_alloc_tag_set(&hba->tmf_tag_set);
        if (err < 0)
                goto out_remove_scsi_host;
-       hba->tmf_queue = blk_mq_init_queue(&hba->tmf_tag_set);
+       hba->tmf_queue = blk_mq_alloc_queue(&hba->tmf_tag_set, NULL, NULL);
        if (IS_ERR(hba->tmf_queue)) {
                err = PTR_ERR(hba->tmf_queue);
                goto free_tmf_tag_set;
 
 })
 struct gendisk *blk_mq_alloc_disk_for_queue(struct request_queue *q,
                struct lock_class_key *lkclass);
-struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
+struct request_queue *blk_mq_alloc_queue(struct blk_mq_tag_set *set,
+               struct queue_limits *lim, void *queuedata);
 int blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
                struct request_queue *q);
 void blk_mq_destroy_queue(struct request_queue *);