block: move ->bio_split to the gendisk
authorChristoph Hellwig <hch@lst.de>
Wed, 27 Jul 2022 16:22:57 +0000 (12:22 -0400)
committerJens Axboe <axboe@kernel.dk>
Wed, 3 Aug 2022 03:08:49 +0000 (21:08 -0600)
Only non-passthrough requests are split by the block layer and use the
->bio_split bio_set.  Move it from the request_queue to the gendisk.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20220727162300.3089193-4-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-core.c
block/blk-merge.c
block/blk-sysfs.c
block/genhd.c
drivers/md/dm.c
include/linux/blkdev.h

index 3d286a2..a0d1104 100644 (file)
@@ -377,7 +377,6 @@ static void blk_timeout_work(struct work_struct *work)
 struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
 {
        struct request_queue *q;
-       int ret;
 
        q = kmem_cache_alloc_node(blk_get_queue_kmem_cache(alloc_srcu),
                        GFP_KERNEL | __GFP_ZERO, node_id);
@@ -396,13 +395,9 @@ struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
        if (q->id < 0)
                goto fail_srcu;
 
-       ret = bioset_init(&q->bio_split, BIO_POOL_SIZE, 0, 0);
-       if (ret)
-               goto fail_id;
-
        q->stats = blk_alloc_queue_stats();
        if (!q->stats)
-               goto fail_split;
+               goto fail_id;
 
        q->node = node_id;
 
@@ -439,8 +434,6 @@ struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
 
 fail_stats:
        blk_free_queue_stats(q->stats);
-fail_split:
-       bioset_exit(&q->bio_split);
 fail_id:
        ida_free(&blk_queue_ida, q->id);
 fail_srcu:
index 6e29fb2..30872a3 100644 (file)
@@ -331,18 +331,19 @@ split:
 struct bio *__bio_split_to_limits(struct bio *bio, struct request_queue *q,
                       unsigned int *nr_segs)
 {
+       struct bio_set *bs = &bio->bi_bdev->bd_disk->bio_split;
        struct bio *split;
 
        switch (bio_op(bio)) {
        case REQ_OP_DISCARD:
        case REQ_OP_SECURE_ERASE:
-               split = bio_split_discard(bio, q, nr_segs, &q->bio_split);
+               split = bio_split_discard(bio, q, nr_segs, bs);
                break;
        case REQ_OP_WRITE_ZEROES:
-               split = bio_split_write_zeroes(bio, q, nr_segs, &q->bio_split);
+               split = bio_split_write_zeroes(bio, q, nr_segs, bs);
                break;
        default:
-               split = bio_split_rw(bio, q, nr_segs, &q->bio_split);
+               split = bio_split_rw(bio, q, nr_segs, bs);
                break;
        }
 
index c030302..e1f009a 100644 (file)
@@ -779,8 +779,6 @@ static void blk_release_queue(struct kobject *kobj)
        if (queue_is_mq(q))
                blk_mq_release(q);
 
-       bioset_exit(&q->bio_split);
-
        if (blk_queue_has_srcu(q))
                cleanup_srcu_struct(q->srcu);
 
index e1d5b10..b901fea 100644 (file)
@@ -1151,6 +1151,7 @@ static void disk_release(struct device *dev)
                blk_mq_exit_queue(disk->queue);
 
        blkcg_exit_queue(disk->queue);
+       bioset_exit(&disk->bio_split);
 
        disk_release_events(disk);
        kfree(disk->random);
@@ -1342,9 +1343,12 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
        if (!disk)
                goto out_put_queue;
 
+       if (bioset_init(&disk->bio_split, BIO_POOL_SIZE, 0, 0))
+               goto out_free_disk;
+
        disk->bdi = bdi_alloc(node_id);
        if (!disk->bdi)
-               goto out_free_disk;
+               goto out_free_bioset;
 
        /* bdev_alloc() might need the queue, set before the first call */
        disk->queue = q;
@@ -1382,6 +1386,8 @@ out_destroy_part_tbl:
        iput(disk->part0->bd_inode);
 out_free_bdi:
        bdi_put(disk->bdi);
+out_free_bioset:
+       bioset_exit(&disk->bio_split);
 out_free_disk:
        kfree(disk);
 out_put_queue:
index fbcffcf..28bd4a3 100644 (file)
@@ -1016,7 +1016,7 @@ static void dm_wq_requeue_work(struct work_struct *work)
        while (io) {
                struct dm_io *next = io->next;
 
-               dm_io_rewind(io, &md->queue->bio_split);
+               dm_io_rewind(io, &md->disk->bio_split);
 
                io->next = NULL;
                __dm_io_complete(io, false);
index 5eef8d2..49dcd31 100644 (file)
@@ -140,6 +140,8 @@ struct gendisk {
        struct request_queue *queue;
        void *private_data;
 
+       struct bio_set bio_split;
+
        int flags;
        unsigned long state;
 #define GD_NEED_PART_SCAN              0
@@ -531,7 +533,6 @@ struct request_queue {
 
        struct blk_mq_tag_set   *tag_set;
        struct list_head        tag_set_list;
-       struct bio_set          bio_split;
 
        struct dentry           *debugfs_dir;
        struct dentry           *sched_debugfs_dir;