block: pass a queue_limits argument to blk_mq_init_queue
authorChristoph Hellwig <hch@lst.de>
Tue, 13 Feb 2024 07:34:19 +0000 (08:34 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 13 Feb 2024 15:56:59 +0000 (08:56 -0700)
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>
block/blk-mq.c
block/bsg-lib.c
drivers/nvme/host/apple.c
drivers/nvme/host/core.c
drivers/scsi/scsi_scan.c
drivers/ufs/core/ufshcd.c
include/linux/blk-mq.h

index 9dd8055cc5246d73eb79d121296f36dc662057cb..f6499bbd89be9013b7d6fe10f3e901f2eb3e1991 100644 (file)
@@ -4083,14 +4083,14 @@ void blk_mq_release(struct request_queue *q)
        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;
@@ -4101,20 +4101,15 @@ static struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,
        }
        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
  */
@@ -4141,7 +4136,7 @@ struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata,
        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);
 
index b3acdbdb6e7ea8f62c8d9f76d7ae83a4a35bf0e2..bcc7dee6abced61e33c55950774cfac418375b09 100644 (file)
@@ -383,7 +383,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
        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;
index c727cd1f264bf6221d2043d1f65bb70a51f00c1d..a480cdeac2883c0eb08dbfd32fc4c1adaece7a88 100644 (file)
@@ -1516,7 +1516,7 @@ static int apple_nvme_probe(struct platform_device *pdev)
                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;
index 6e7f9b13fba2d38486847523cbac4d21d41be755..5bcdf3654598e4ff71c7c68d7949927bc4bf6e3b 100644 (file)
@@ -4372,14 +4372,14 @@ int nvme_alloc_admin_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
        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;
@@ -4443,7 +4443,7 @@ int nvme_alloc_io_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
                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;
index 44680f65ea1455daec91d4c6dd98d2cb2431f4e2..9969f4e2f1c3d9c656076e3e540bd17c8352c2af 100644 (file)
@@ -332,7 +332,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget,
 
        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 */
index 029d017fc1b66b5c6695096016b54983e26b3e5f..c502a86db16b308585c0ce0db79e97fd9d6fe40b 100644 (file)
@@ -10592,7 +10592,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
        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;
index 7a8150a5f051339f680b9df83fa78da48b8c8af1..7d42c359e2ab285facf1c04031d3b02c45f5fa86 100644 (file)
@@ -692,7 +692,8 @@ struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata,
 })
 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 *);