block: pass a queue_limits argument to blk_mq_alloc_disk
authorChristoph Hellwig <hch@lst.de>
Tue, 13 Feb 2024 07:34:20 +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_alloc_disk 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.

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-11-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
30 files changed:
arch/um/drivers/ubd_kern.c
block/blk-mq.c
drivers/block/amiflop.c
drivers/block/aoe/aoeblk.c
drivers/block/ataflop.c
drivers/block/floppy.c
drivers/block/loop.c
drivers/block/mtip32xx/mtip32xx.c
drivers/block/nbd.c
drivers/block/null_blk/main.c
drivers/block/ps3disk.c
drivers/block/rbd.c
drivers/block/rnbd/rnbd-clt.c
drivers/block/sunvdc.c
drivers/block/swim.c
drivers/block/swim3.c
drivers/block/ublk_drv.c
drivers/block/virtio_blk.c
drivers/block/xen-blkfront.c
drivers/block/z2ram.c
drivers/cdrom/gdrom.c
drivers/memstick/core/ms_block.c
drivers/memstick/core/mspro_block.c
drivers/mmc/core/queue.c
drivers/mtd/mtd_blkdevs.c
drivers/mtd/ubi/block.c
drivers/nvme/host/core.c
drivers/s390/block/dasd_genhd.c
drivers/s390/block/scm_blk.c
include/linux/blk-mq.h

index 92ee2697ff398458c004ce4bc7515abfc0def5d4..25f1b18ce7d4e936a5031d826d147bd14f3a07ad 100644 (file)
@@ -906,7 +906,7 @@ static int ubd_add(int n, char **error_out)
        if (err)
                goto out;
 
-       disk = blk_mq_alloc_disk(&ubd_dev->tag_set, ubd_dev);
+       disk = blk_mq_alloc_disk(&ubd_dev->tag_set, NULL, ubd_dev);
        if (IS_ERR(disk)) {
                err = PTR_ERR(disk);
                goto out_cleanup_tags;
index f6499bbd89be9013b7d6fe10f3e901f2eb3e1991..6abb4ce46baa1ee20118d227084cee9169964805 100644 (file)
@@ -4130,13 +4130,14 @@ void blk_mq_destroy_queue(struct request_queue *q)
 }
 EXPORT_SYMBOL(blk_mq_destroy_queue);
 
-struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata,
+struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set,
+               struct queue_limits *lim, void *queuedata,
                struct lock_class_key *lkclass)
 {
        struct request_queue *q;
        struct gendisk *disk;
 
-       q = blk_mq_alloc_queue(set, NULL, queuedata);
+       q = blk_mq_alloc_queue(set, lim, queuedata);
        if (IS_ERR(q))
                return ERR_CAST(q);
 
index 2b98114a9fe0926d8b79021ff60e5d92dd2b8e37..a25414228e47410fe7756e5cc434fe2b0f53115d 100644 (file)
@@ -1779,7 +1779,7 @@ static int fd_alloc_disk(int drive, int system)
        struct gendisk *disk;
        int err;
 
-       disk = blk_mq_alloc_disk(&unit[drive].tag_set, NULL);
+       disk = blk_mq_alloc_disk(&unit[drive].tag_set, NULL, NULL);
        if (IS_ERR(disk))
                return PTR_ERR(disk);
 
index b1b47d88f5db44dd9dcb8fc7468718ac36869130..2ff6e2da8cc41c8e36b89fd60dff04dd7eed3dd6 100644 (file)
@@ -371,7 +371,7 @@ aoeblk_gdalloc(void *vp)
                goto err_mempool;
        }
 
-       gd = blk_mq_alloc_disk(set, d);
+       gd = blk_mq_alloc_disk(set, NULL, d);
        if (IS_ERR(gd)) {
                pr_err("aoe: cannot allocate block queue for %ld.%d\n",
                        d->aoemajor, d->aoeminor);
index 50949207798d2a27a3fb6c86e94c5afd490ff5d6..cacc4ba942a814015fa82e592c8f946340a5a577 100644 (file)
@@ -1994,7 +1994,7 @@ static int ataflop_alloc_disk(unsigned int drive, unsigned int type)
 {
        struct gendisk *disk;
 
-       disk = blk_mq_alloc_disk(&unit[drive].tag_set, NULL);
+       disk = blk_mq_alloc_disk(&unit[drive].tag_set, NULL, NULL);
        if (IS_ERR(disk))
                return PTR_ERR(disk);
 
index 2ba0ba1359515fd2e1f97a68ca66caaa0ae5bcee..582cf50c6bf6b82b6934420ede6d7adf35679ef9 100644 (file)
@@ -4518,7 +4518,7 @@ static int floppy_alloc_disk(unsigned int drive, unsigned int type)
 {
        struct gendisk *disk;
 
-       disk = blk_mq_alloc_disk(&tag_sets[drive], NULL);
+       disk = blk_mq_alloc_disk(&tag_sets[drive], NULL, NULL);
        if (IS_ERR(disk))
                return PTR_ERR(disk);
 
index f8145499da38c834225b8f2d2ee0448d19adc8e1..3f855cc79c29f50c71db232ccabeb15363af9401 100644 (file)
@@ -2025,7 +2025,7 @@ static int loop_add(int i)
        if (err)
                goto out_free_idr;
 
-       disk = lo->lo_disk = blk_mq_alloc_disk(&lo->tag_set, lo);
+       disk = lo->lo_disk = blk_mq_alloc_disk(&lo->tag_set, NULL, lo);
        if (IS_ERR(disk)) {
                err = PTR_ERR(disk);
                goto out_cleanup_tags;
index b200950e8fb5f9b7c5efcb044dddf52087765e2e..ac08dea73552f4e610647752144179e58dce55b8 100644 (file)
@@ -3431,7 +3431,7 @@ static int mtip_block_initialize(struct driver_data *dd)
                goto block_queue_alloc_tag_error;
        }
 
-       dd->disk = blk_mq_alloc_disk(&dd->tags, dd);
+       dd->disk = blk_mq_alloc_disk(&dd->tags, NULL, dd);
        if (IS_ERR(dd->disk)) {
                dev_err(&dd->pdev->dev,
                        "Unable to allocate request queue\n");
index 33a8f37bb6a1f504060f783c6d727e4c76026a2e..30ae3cc12e7787ba36a054f3418fd62a4ad6bf7f 100644 (file)
@@ -1823,7 +1823,7 @@ static struct nbd_device *nbd_dev_add(int index, unsigned int refs)
        if (err < 0)
                goto out_free_tags;
 
-       disk = blk_mq_alloc_disk(&nbd->tag_set, NULL);
+       disk = blk_mq_alloc_disk(&nbd->tag_set, NULL, NULL);
        if (IS_ERR(disk)) {
                err = PTR_ERR(disk);
                goto out_free_idr;
index 4281371c81fed12445a6f7d893682619c7d24872..eeb895ec6f34aeaeb3aaef7d23dc4a6fbdf62b1a 100644 (file)
@@ -2147,7 +2147,7 @@ static int null_add_dev(struct nullb_device *dev)
                        goto out_cleanup_queues;
 
                nullb->tag_set->timeout = 5 * HZ;
-               nullb->disk = blk_mq_alloc_disk(nullb->tag_set, nullb);
+               nullb->disk = blk_mq_alloc_disk(nullb->tag_set, NULL, nullb);
                if (IS_ERR(nullb->disk)) {
                        rv = PTR_ERR(nullb->disk);
                        goto out_cleanup_tags;
index 36d7b36c60c76bd705115f4ce61bf1c50bafab11..dfd3860df4f880a797f40e1bbc980bd0ab88739d 100644 (file)
@@ -431,7 +431,7 @@ static int ps3disk_probe(struct ps3_system_bus_device *_dev)
        if (error)
                goto fail_teardown;
 
-       gendisk = blk_mq_alloc_disk(&priv->tag_set, dev);
+       gendisk = blk_mq_alloc_disk(&priv->tag_set, NULL, dev);
        if (IS_ERR(gendisk)) {
                dev_err(&dev->sbd.core, "%s:%u: blk_mq_alloc_disk failed\n",
                        __func__, __LINE__);
index 00ca8a1d8c46fff787295b2d0097fd101450cd3a..6b4f1898a722a392ece02d866f1cb73a515b509f 100644 (file)
@@ -4966,7 +4966,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
        if (err)
                return err;
 
-       disk = blk_mq_alloc_disk(&rbd_dev->tag_set, rbd_dev);
+       disk = blk_mq_alloc_disk(&rbd_dev->tag_set, NULL, rbd_dev);
        if (IS_ERR(disk)) {
                err = PTR_ERR(disk);
                goto out_tag_set;
index 4044c369d22a5f6229d2907acacbba497c03b8f4..d51be4f2df61a351ff02ef64ee45c6f6920d850d 100644 (file)
@@ -1408,7 +1408,7 @@ static int rnbd_client_setup_device(struct rnbd_clt_dev *dev,
        dev->size = le64_to_cpu(rsp->nsectors) *
                        le16_to_cpu(rsp->logical_block_size);
 
-       dev->gd = blk_mq_alloc_disk(&dev->sess->tag_set, dev);
+       dev->gd = blk_mq_alloc_disk(&dev->sess->tag_set, NULL, dev);
        if (IS_ERR(dev->gd))
                return PTR_ERR(dev->gd);
        dev->queue = dev->gd->queue;
index 7bf4b48e2282e72247d3db519110d4de04b80f14..a1f74dd1eae5d593c223163e4b73b6b39bf0f723 100644 (file)
@@ -824,7 +824,7 @@ static int probe_disk(struct vdc_port *port)
        if (err)
                return err;
 
-       g = blk_mq_alloc_disk(&port->tag_set, port);
+       g = blk_mq_alloc_disk(&port->tag_set, NULL, port);
        if (IS_ERR(g)) {
                printk(KERN_ERR PFX "%s: Could not allocate gendisk.\n",
                       port->vio.name);
index f85b6af414b4318b394665bec1a679f174b31755..16bdf62067d8b1acc63f5328c9b4455ad96bec7f 100644 (file)
@@ -820,7 +820,7 @@ static int swim_floppy_init(struct swim_priv *swd)
                        goto exit_put_disks;
 
                swd->unit[drive].disk =
-                       blk_mq_alloc_disk(&swd->unit[drive].tag_set,
+                       blk_mq_alloc_disk(&swd->unit[drive].tag_set, NULL,
                                          &swd->unit[drive]);
                if (IS_ERR(swd->unit[drive].disk)) {
                        blk_mq_free_tag_set(&swd->unit[drive].tag_set);
index c2bc85826358e93df0896821529ac8a5e81caa19..a04756ac778ee803ddbe287d7c770ceceb247694 100644 (file)
@@ -1210,7 +1210,7 @@ static int swim3_attach(struct macio_dev *mdev,
        if (rc)
                goto out_unregister;
 
-       disk = blk_mq_alloc_disk(&fs->tag_set, fs);
+       disk = blk_mq_alloc_disk(&fs->tag_set, NULL, fs);
        if (IS_ERR(disk)) {
                rc = PTR_ERR(disk);
                goto out_free_tag_set;
index 1dfb2e77898ba64215c8da9a9f3219f91f3616a6..c5b6552707984bc41f55eb2c1d6d916842f98070 100644 (file)
@@ -2222,7 +2222,7 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub, struct io_uring_cmd *cmd)
                goto out_unlock;
        }
 
-       disk = blk_mq_alloc_disk(&ub->tag_set, NULL);
+       disk = blk_mq_alloc_disk(&ub->tag_set, NULL, NULL);
        if (IS_ERR(disk)) {
                ret = PTR_ERR(disk);
                goto out_unlock;
index 5bf98fd6a651a506ff294545d6241f608af34568..a23fce4eca44082f6059d68e6e06b2d9f694d6f7 100644 (file)
@@ -1330,7 +1330,7 @@ static int virtblk_probe(struct virtio_device *vdev)
        if (err)
                goto out_free_vq;
 
-       vblk->disk = blk_mq_alloc_disk(&vblk->tag_set, vblk);
+       vblk->disk = blk_mq_alloc_disk(&vblk->tag_set, NULL, vblk);
        if (IS_ERR(vblk->disk)) {
                err = PTR_ERR(vblk->disk);
                goto out_free_tags;
index 434fab306777439754a0f9feed417f848b2442a4..4cc2884e7484635eba512d89eecbf53688c8810c 100644 (file)
@@ -1136,7 +1136,7 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
        if (err)
                goto out_release_minors;
 
-       gd = blk_mq_alloc_disk(&info->tag_set, info);
+       gd = blk_mq_alloc_disk(&info->tag_set, NULL, info);
        if (IS_ERR(gd)) {
                err = PTR_ERR(gd);
                goto out_free_tag_set;
index 11493167b0a848a255b5db442f97cb71e3f97e6a..7c5f4e4d9b50374cb96f5b1699cbeb0a60cc54d6 100644 (file)
@@ -318,7 +318,7 @@ static int z2ram_register_disk(int minor)
        struct gendisk *disk;
        int err;
 
-       disk = blk_mq_alloc_disk(&tag_set, NULL);
+       disk = blk_mq_alloc_disk(&tag_set, NULL, NULL);
        if (IS_ERR(disk))
                return PTR_ERR(disk);
 
index d668b174ace92fbd7e6a8635034f01249afb67e2..1d044779f5e42a9d126a28caaa2c20c53b4c76f2 100644 (file)
@@ -778,7 +778,7 @@ static int probe_gdrom(struct platform_device *devptr)
        if (err)
                goto probe_fail_free_cd_info;
 
-       gd.disk = blk_mq_alloc_disk(&gd.tag_set, NULL);
+       gd.disk = blk_mq_alloc_disk(&gd.tag_set, NULL, NULL);
        if (IS_ERR(gd.disk)) {
                err = PTR_ERR(gd.disk);
                goto probe_fail_free_tag_set;
index 04115cd92433bfb9134708f0e3373bb21baa7c19..d3277c901d16bb90f3d45789357a70b01c207ac7 100644 (file)
@@ -2093,7 +2093,7 @@ static int msb_init_disk(struct memstick_dev *card)
        if (rc)
                goto out_release_id;
 
-       msb->disk = blk_mq_alloc_disk(&msb->tag_set, card);
+       msb->disk = blk_mq_alloc_disk(&msb->tag_set, NULL, card);
        if (IS_ERR(msb->disk)) {
                rc = PTR_ERR(msb->disk);
                goto out_free_tag_set;
index 5a69ed33999b4c4c0e5565dc9a3b58f2e8e0871d..db0e2a42ca3c32fee6cec526358b1014bdfd0572 100644 (file)
@@ -1138,7 +1138,7 @@ static int mspro_block_init_disk(struct memstick_dev *card)
        if (rc)
                goto out_release_id;
 
-       msb->disk = blk_mq_alloc_disk(&msb->tag_set, card);
+       msb->disk = blk_mq_alloc_disk(&msb->tag_set, NULL, card);
        if (IS_ERR(msb->disk)) {
                rc = PTR_ERR(msb->disk);
                goto out_free_tag_set;
index a0a2412f62a7304278220a9f72e0ea84d4e2a508..67ad186d132a699f7ce4fc16fc9e059219882001 100644 (file)
@@ -447,7 +447,7 @@ struct gendisk *mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card)
                return ERR_PTR(ret);
                
 
-       disk = blk_mq_alloc_disk(&mq->tag_set, mq);
+       disk = blk_mq_alloc_disk(&mq->tag_set, NULL, mq);
        if (IS_ERR(disk)) {
                blk_mq_free_tag_set(&mq->tag_set);
                return disk;
index f0526dcc216276fa212f3cc5d21c8a9bc250d64b..b8878a2457afa7e02d882c3950b5bc155f53c6d2 100644 (file)
@@ -333,7 +333,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
                goto out_kfree_tag_set;
 
        /* Create gendisk */
-       gd = blk_mq_alloc_disk(new->tag_set, new);
+       gd = blk_mq_alloc_disk(new->tag_set, NULL, new);
        if (IS_ERR(gd)) {
                ret = PTR_ERR(gd);
                goto out_free_tag_set;
index 654bd7372cd8c09c69bf7c205a728f263dcc3dfc..9be87c231a2eba40800cd69357d0eba10a4703f2 100644 (file)
@@ -393,7 +393,7 @@ int ubiblock_create(struct ubi_volume_info *vi)
 
 
        /* Initialize the gendisk of this ubiblock device */
-       gd = blk_mq_alloc_disk(&dev->tag_set, dev);
+       gd = blk_mq_alloc_disk(&dev->tag_set, NULL, dev);
        if (IS_ERR(gd)) {
                ret = PTR_ERR(gd);
                goto out_free_tags;
index 5bcdf3654598e4ff71c7c68d7949927bc4bf6e3b..eed3e22e24d913ee91d9b23550504d1dbb931c0a 100644 (file)
@@ -3694,7 +3694,7 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, struct nvme_ns_info *info)
        if (!ns)
                return;
 
-       disk = blk_mq_alloc_disk(ctrl->tagset, ns);
+       disk = blk_mq_alloc_disk(ctrl->tagset, NULL, ns);
        if (IS_ERR(disk))
                goto out_free_ns;
        disk->fops = &nvme_bdev_ops;
index 30e8ee583e980e84ff0735d64671cddcebfa3e9c..0465b706745f64c95a338a6170311b00a4b9fac6 100644 (file)
@@ -53,7 +53,7 @@ int dasd_gendisk_alloc(struct dasd_block *block)
        if (rc)
                return rc;
 
-       gdp = blk_mq_alloc_disk(&block->tag_set, block);
+       gdp = blk_mq_alloc_disk(&block->tag_set, NULL, block);
        if (IS_ERR(gdp)) {
                blk_mq_free_tag_set(&block->tag_set);
                return PTR_ERR(gdp);
index ade95e91b3c8db6f657fdcb7bcec2c8589175e43..d05b2e2799a47a7d409a6d5ab4977105e9a035fb 100644 (file)
@@ -462,7 +462,7 @@ int scm_blk_dev_setup(struct scm_blk_dev *bdev, struct scm_device *scmdev)
        if (ret)
                goto out;
 
-       bdev->gendisk = blk_mq_alloc_disk(&bdev->tag_set, scmdev);
+       bdev->gendisk = blk_mq_alloc_disk(&bdev->tag_set, NULL, scmdev);
        if (IS_ERR(bdev->gendisk)) {
                ret = PTR_ERR(bdev->gendisk);
                goto out_tag;
index 7d42c359e2ab285facf1c04031d3b02c45f5fa86..390d35fa0032959d7184297fdb9715b680257956 100644 (file)
@@ -682,13 +682,14 @@ enum {
 
 #define BLK_MQ_NO_HCTX_IDX     (-1U)
 
-struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata,
+struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set,
+               struct queue_limits *lim, void *queuedata,
                struct lock_class_key *lkclass);
-#define blk_mq_alloc_disk(set, queuedata)                              \
+#define blk_mq_alloc_disk(set, lim, queuedata)                         \
 ({                                                                     \
        static struct lock_class_key __key;                             \
                                                                        \
-       __blk_mq_alloc_disk(set, queuedata, &__key);                    \
+       __blk_mq_alloc_disk(set, lim, queuedata, &__key);               \
 })
 struct gendisk *blk_mq_alloc_disk_for_queue(struct request_queue *q,
                struct lock_class_key *lkclass);