Skip to content

Commit 46754bd

Browse files
Christoph Hellwigaxboe
authored andcommitted
block: move ->bio_split to the gendisk
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>
1 parent 51d798c commit 46754bd

6 files changed

Lines changed: 15 additions & 16 deletions

File tree

block/blk-core.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,6 @@ static void blk_timeout_work(struct work_struct *work)
377377
struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
378378
{
379379
struct request_queue *q;
380-
int ret;
381380

382381
q = kmem_cache_alloc_node(blk_get_queue_kmem_cache(alloc_srcu),
383382
GFP_KERNEL | __GFP_ZERO, node_id);
@@ -396,13 +395,9 @@ struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
396395
if (q->id < 0)
397396
goto fail_srcu;
398397

399-
ret = bioset_init(&q->bio_split, BIO_POOL_SIZE, 0, 0);
400-
if (ret)
401-
goto fail_id;
402-
403398
q->stats = blk_alloc_queue_stats();
404399
if (!q->stats)
405-
goto fail_split;
400+
goto fail_id;
406401

407402
q->node = node_id;
408403

@@ -439,8 +434,6 @@ struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
439434

440435
fail_stats:
441436
blk_free_queue_stats(q->stats);
442-
fail_split:
443-
bioset_exit(&q->bio_split);
444437
fail_id:
445438
ida_free(&blk_queue_ida, q->id);
446439
fail_srcu:

block/blk-merge.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,18 +331,19 @@ static struct bio *bio_split_rw(struct bio *bio, struct request_queue *q,
331331
struct bio *__bio_split_to_limits(struct bio *bio, struct request_queue *q,
332332
unsigned int *nr_segs)
333333
{
334+
struct bio_set *bs = &bio->bi_bdev->bd_disk->bio_split;
334335
struct bio *split;
335336

336337
switch (bio_op(bio)) {
337338
case REQ_OP_DISCARD:
338339
case REQ_OP_SECURE_ERASE:
339-
split = bio_split_discard(bio, q, nr_segs, &q->bio_split);
340+
split = bio_split_discard(bio, q, nr_segs, bs);
340341
break;
341342
case REQ_OP_WRITE_ZEROES:
342-
split = bio_split_write_zeroes(bio, q, nr_segs, &q->bio_split);
343+
split = bio_split_write_zeroes(bio, q, nr_segs, bs);
343344
break;
344345
default:
345-
split = bio_split_rw(bio, q, nr_segs, &q->bio_split);
346+
split = bio_split_rw(bio, q, nr_segs, bs);
346347
break;
347348
}
348349

block/blk-sysfs.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -779,8 +779,6 @@ static void blk_release_queue(struct kobject *kobj)
779779
if (queue_is_mq(q))
780780
blk_mq_release(q);
781781

782-
bioset_exit(&q->bio_split);
783-
784782
if (blk_queue_has_srcu(q))
785783
cleanup_srcu_struct(q->srcu);
786784

block/genhd.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,7 @@ static void disk_release(struct device *dev)
11511151
blk_mq_exit_queue(disk->queue);
11521152

11531153
blkcg_exit_queue(disk->queue);
1154+
bioset_exit(&disk->bio_split);
11541155

11551156
disk_release_events(disk);
11561157
kfree(disk->random);
@@ -1342,9 +1343,12 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
13421343
if (!disk)
13431344
goto out_put_queue;
13441345

1346+
if (bioset_init(&disk->bio_split, BIO_POOL_SIZE, 0, 0))
1347+
goto out_free_disk;
1348+
13451349
disk->bdi = bdi_alloc(node_id);
13461350
if (!disk->bdi)
1347-
goto out_free_disk;
1351+
goto out_free_bioset;
13481352

13491353
/* bdev_alloc() might need the queue, set before the first call */
13501354
disk->queue = q;
@@ -1382,6 +1386,8 @@ struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
13821386
iput(disk->part0->bd_inode);
13831387
out_free_bdi:
13841388
bdi_put(disk->bdi);
1389+
out_free_bioset:
1390+
bioset_exit(&disk->bio_split);
13851391
out_free_disk:
13861392
kfree(disk);
13871393
out_put_queue:

drivers/md/dm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1016,7 +1016,7 @@ static void dm_wq_requeue_work(struct work_struct *work)
10161016
while (io) {
10171017
struct dm_io *next = io->next;
10181018

1019-
dm_io_rewind(io, &md->queue->bio_split);
1019+
dm_io_rewind(io, &md->disk->bio_split);
10201020

10211021
io->next = NULL;
10221022
__dm_io_complete(io, false);

include/linux/blkdev.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ struct gendisk {
140140
struct request_queue *queue;
141141
void *private_data;
142142

143+
struct bio_set bio_split;
144+
143145
int flags;
144146
unsigned long state;
145147
#define GD_NEED_PART_SCAN 0
@@ -531,7 +533,6 @@ struct request_queue {
531533

532534
struct blk_mq_tag_set *tag_set;
533535
struct list_head tag_set_list;
534-
struct bio_set bio_split;
535536

536537
struct dentry *debugfs_dir;
537538
struct dentry *sched_debugfs_dir;

0 commit comments

Comments
 (0)