Skip to content

Commit 8ae1266

Browse files
koverstreetaxboe
authored andcommitted
block: kill merge_bvec_fn() completely
As generic_make_request() is now able to handle arbitrarily sized bios, it's no longer necessary for each individual block driver to define its own ->merge_bvec_fn() callback. Remove every invocation completely. Cc: Jens Axboe <axboe@kernel.dk> Cc: Lars Ellenberg <drbd-dev@lists.linbit.com> Cc: drbd-user@lists.linbit.com Cc: Jiri Kosina <jkosina@suse.cz> Cc: Yehuda Sadeh <yehuda@inktank.com> Cc: Sage Weil <sage@inktank.com> Cc: Alex Elder <elder@kernel.org> Cc: ceph-devel@vger.kernel.org Cc: Alasdair Kergon <agk@redhat.com> Cc: Mike Snitzer <snitzer@redhat.com> Cc: dm-devel@redhat.com Cc: Neil Brown <neilb@suse.de> Cc: linux-raid@vger.kernel.org Cc: Christoph Hellwig <hch@infradead.org> Cc: "Martin K. Petersen" <martin.petersen@oracle.com> Acked-by: NeilBrown <neilb@suse.de> (for the 'md' bits) Acked-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> [dpark: also remove ->merge_bvec_fn() in dm-thin as well as dm-era-target, and resolve merge conflicts] Signed-off-by: Dongsu Park <dpark@posteo.net> Signed-off-by: Ming Lin <ming.l@ssi.samsung.com> Signed-off-by: Jens Axboe <axboe@fb.com>
1 parent 7140aaf commit 8ae1266

32 files changed

+9
-859
lines changed

block/blk-merge.c

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,13 @@ static struct bio *blk_bio_segment_split(struct request_queue *q,
6969
struct bio *split;
7070
struct bio_vec bv, bvprv;
7171
struct bvec_iter iter;
72-
unsigned seg_size = 0, nsegs = 0;
72+
unsigned seg_size = 0, nsegs = 0, sectors = 0;
7373
int prev = 0;
7474

75-
struct bvec_merge_data bvm = {
76-
.bi_bdev = bio->bi_bdev,
77-
.bi_sector = bio->bi_iter.bi_sector,
78-
.bi_size = 0,
79-
.bi_rw = bio->bi_rw,
80-
};
81-
8275
bio_for_each_segment(bv, bio, iter) {
83-
if (q->merge_bvec_fn &&
84-
q->merge_bvec_fn(q, &bvm, &bv) < (int) bv.bv_len)
85-
goto split;
86-
87-
bvm.bi_size += bv.bv_len;
76+
sectors += bv.bv_len >> 9;
8877

89-
if (bvm.bi_size >> 9 > queue_max_sectors(q))
78+
if (sectors > queue_max_sectors(q))
9079
goto split;
9180

9281
/*

block/blk-settings.c

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -53,28 +53,6 @@ void blk_queue_unprep_rq(struct request_queue *q, unprep_rq_fn *ufn)
5353
}
5454
EXPORT_SYMBOL(blk_queue_unprep_rq);
5555

56-
/**
57-
* blk_queue_merge_bvec - set a merge_bvec function for queue
58-
* @q: queue
59-
* @mbfn: merge_bvec_fn
60-
*
61-
* Usually queues have static limitations on the max sectors or segments that
62-
* we can put in a request. Stacking drivers may have some settings that
63-
* are dynamic, and thus we have to query the queue whether it is ok to
64-
* add a new bio_vec to a bio at a given offset or not. If the block device
65-
* has such limitations, it needs to register a merge_bvec_fn to control
66-
* the size of bio's sent to it. Note that a block device *must* allow a
67-
* single page to be added to an empty bio. The block device driver may want
68-
* to use the bio_split() function to deal with these bio's. By default
69-
* no merge_bvec_fn is defined for a queue, and only the fixed limits are
70-
* honored.
71-
*/
72-
void blk_queue_merge_bvec(struct request_queue *q, merge_bvec_fn *mbfn)
73-
{
74-
q->merge_bvec_fn = mbfn;
75-
}
76-
EXPORT_SYMBOL(blk_queue_merge_bvec);
77-
7856
void blk_queue_softirq_done(struct request_queue *q, softirq_done_fn *fn)
7957
{
8058
q->softirq_done_fn = fn;

drivers/block/drbd/drbd_int.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1450,7 +1450,6 @@ extern void do_submit(struct work_struct *ws);
14501450
extern void __drbd_make_request(struct drbd_device *, struct bio *, unsigned long);
14511451
extern void drbd_make_request(struct request_queue *q, struct bio *bio);
14521452
extern int drbd_read_remote(struct drbd_device *device, struct drbd_request *req);
1453-
extern int drbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bvm, struct bio_vec *bvec);
14541453
extern int is_valid_ar_handle(struct drbd_request *, sector_t);
14551454

14561455

drivers/block/drbd/drbd_main.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2774,7 +2774,6 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
27742774
This triggers a max_bio_size message upon first attach or connect */
27752775
blk_queue_max_hw_sectors(q, DRBD_MAX_BIO_SIZE_SAFE >> 8);
27762776
blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
2777-
blk_queue_merge_bvec(q, drbd_merge_bvec);
27782777
q->queue_lock = &resource->req_lock;
27792778

27802779
device->md_io.page = alloc_page(GFP_KERNEL);

drivers/block/drbd/drbd_req.c

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,41 +1512,6 @@ void drbd_make_request(struct request_queue *q, struct bio *bio)
15121512
__drbd_make_request(device, bio, start_jif);
15131513
}
15141514

1515-
/* This is called by bio_add_page().
1516-
*
1517-
* q->max_hw_sectors and other global limits are already enforced there.
1518-
*
1519-
* We need to call down to our lower level device,
1520-
* in case it has special restrictions.
1521-
*
1522-
* We also may need to enforce configured max-bio-bvecs limits.
1523-
*
1524-
* As long as the BIO is empty we have to allow at least one bvec,
1525-
* regardless of size and offset, so no need to ask lower levels.
1526-
*/
1527-
int drbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bvm, struct bio_vec *bvec)
1528-
{
1529-
struct drbd_device *device = (struct drbd_device *) q->queuedata;
1530-
unsigned int bio_size = bvm->bi_size;
1531-
int limit = DRBD_MAX_BIO_SIZE;
1532-
int backing_limit;
1533-
1534-
if (bio_size && get_ldev(device)) {
1535-
unsigned int max_hw_sectors = queue_max_hw_sectors(q);
1536-
struct request_queue * const b =
1537-
device->ldev->backing_bdev->bd_disk->queue;
1538-
if (b->merge_bvec_fn) {
1539-
bvm->bi_bdev = device->ldev->backing_bdev;
1540-
backing_limit = b->merge_bvec_fn(b, bvm, bvec);
1541-
limit = min(limit, backing_limit);
1542-
}
1543-
put_ldev(device);
1544-
if ((limit >> 9) > max_hw_sectors)
1545-
limit = max_hw_sectors << 9;
1546-
}
1547-
return limit;
1548-
}
1549-
15501515
void request_timer_fn(unsigned long data)
15511516
{
15521517
struct drbd_device *device = (struct drbd_device *) data;

drivers/block/pktcdvd.c

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2506,34 +2506,13 @@ static void pkt_make_request(struct request_queue *q, struct bio *bio)
25062506

25072507

25082508

2509-
static int pkt_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd,
2510-
struct bio_vec *bvec)
2511-
{
2512-
struct pktcdvd_device *pd = q->queuedata;
2513-
sector_t zone = get_zone(bmd->bi_sector, pd);
2514-
int used = ((bmd->bi_sector - zone) << 9) + bmd->bi_size;
2515-
int remaining = (pd->settings.size << 9) - used;
2516-
int remaining2;
2517-
2518-
/*
2519-
* A bio <= PAGE_SIZE must be allowed. If it crosses a packet
2520-
* boundary, pkt_make_request() will split the bio.
2521-
*/
2522-
remaining2 = PAGE_SIZE - bmd->bi_size;
2523-
remaining = max(remaining, remaining2);
2524-
2525-
BUG_ON(remaining < 0);
2526-
return remaining;
2527-
}
2528-
25292509
static void pkt_init_queue(struct pktcdvd_device *pd)
25302510
{
25312511
struct request_queue *q = pd->disk->queue;
25322512

25332513
blk_queue_make_request(q, pkt_make_request);
25342514
blk_queue_logical_block_size(q, CD_FRAMESIZE);
25352515
blk_queue_max_hw_sectors(q, PACKET_MAX_SECTORS);
2536-
blk_queue_merge_bvec(q, pkt_merge_bvec);
25372516
q->queuedata = pd;
25382517
}
25392518

drivers/block/rbd.c

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3462,52 +3462,6 @@ static int rbd_queue_rq(struct blk_mq_hw_ctx *hctx,
34623462
return BLK_MQ_RQ_QUEUE_OK;
34633463
}
34643464

3465-
/*
3466-
* a queue callback. Makes sure that we don't create a bio that spans across
3467-
* multiple osd objects. One exception would be with a single page bios,
3468-
* which we handle later at bio_chain_clone_range()
3469-
*/
3470-
static int rbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd,
3471-
struct bio_vec *bvec)
3472-
{
3473-
struct rbd_device *rbd_dev = q->queuedata;
3474-
sector_t sector_offset;
3475-
sector_t sectors_per_obj;
3476-
sector_t obj_sector_offset;
3477-
int ret;
3478-
3479-
/*
3480-
* Find how far into its rbd object the partition-relative
3481-
* bio start sector is to offset relative to the enclosing
3482-
* device.
3483-
*/
3484-
sector_offset = get_start_sect(bmd->bi_bdev) + bmd->bi_sector;
3485-
sectors_per_obj = 1 << (rbd_dev->header.obj_order - SECTOR_SHIFT);
3486-
obj_sector_offset = sector_offset & (sectors_per_obj - 1);
3487-
3488-
/*
3489-
* Compute the number of bytes from that offset to the end
3490-
* of the object. Account for what's already used by the bio.
3491-
*/
3492-
ret = (int) (sectors_per_obj - obj_sector_offset) << SECTOR_SHIFT;
3493-
if (ret > bmd->bi_size)
3494-
ret -= bmd->bi_size;
3495-
else
3496-
ret = 0;
3497-
3498-
/*
3499-
* Don't send back more than was asked for. And if the bio
3500-
* was empty, let the whole thing through because: "Note
3501-
* that a block device *must* allow a single page to be
3502-
* added to an empty bio."
3503-
*/
3504-
rbd_assert(bvec->bv_len <= PAGE_SIZE);
3505-
if (ret > (int) bvec->bv_len || !bmd->bi_size)
3506-
ret = (int) bvec->bv_len;
3507-
3508-
return ret;
3509-
}
3510-
35113465
static void rbd_free_disk(struct rbd_device *rbd_dev)
35123466
{
35133467
struct gendisk *disk = rbd_dev->disk;
@@ -3806,7 +3760,6 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
38063760
blk_queue_max_discard_sectors(q, segment_size / SECTOR_SIZE);
38073761
q->limits.discard_zeroes_data = 1;
38083762

3809-
blk_queue_merge_bvec(q, rbd_merge_bvec);
38103763
disk->queue = q;
38113764

38123765
q->queuedata = rbd_dev;

drivers/md/dm-cache-target.c

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3771,26 +3771,6 @@ static int cache_iterate_devices(struct dm_target *ti,
37713771
return r;
37723772
}
37733773

3774-
/*
3775-
* We assume I/O is going to the origin (which is the volume
3776-
* more likely to have restrictions e.g. by being striped).
3777-
* (Looking up the exact location of the data would be expensive
3778-
* and could always be out of date by the time the bio is submitted.)
3779-
*/
3780-
static int cache_bvec_merge(struct dm_target *ti,
3781-
struct bvec_merge_data *bvm,
3782-
struct bio_vec *biovec, int max_size)
3783-
{
3784-
struct cache *cache = ti->private;
3785-
struct request_queue *q = bdev_get_queue(cache->origin_dev->bdev);
3786-
3787-
if (!q->merge_bvec_fn)
3788-
return max_size;
3789-
3790-
bvm->bi_bdev = cache->origin_dev->bdev;
3791-
return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
3792-
}
3793-
37943774
static void set_discard_limits(struct cache *cache, struct queue_limits *limits)
37953775
{
37963776
/*
@@ -3834,7 +3814,6 @@ static struct target_type cache_target = {
38343814
.status = cache_status,
38353815
.message = cache_message,
38363816
.iterate_devices = cache_iterate_devices,
3837-
.merge = cache_bvec_merge,
38383817
.io_hints = cache_io_hints,
38393818
};
38403819

drivers/md/dm-crypt.c

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2035,21 +2035,6 @@ static int crypt_message(struct dm_target *ti, unsigned argc, char **argv)
20352035
return -EINVAL;
20362036
}
20372037

2038-
static int crypt_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
2039-
struct bio_vec *biovec, int max_size)
2040-
{
2041-
struct crypt_config *cc = ti->private;
2042-
struct request_queue *q = bdev_get_queue(cc->dev->bdev);
2043-
2044-
if (!q->merge_bvec_fn)
2045-
return max_size;
2046-
2047-
bvm->bi_bdev = cc->dev->bdev;
2048-
bvm->bi_sector = cc->start + dm_target_offset(ti, bvm->bi_sector);
2049-
2050-
return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
2051-
}
2052-
20532038
static int crypt_iterate_devices(struct dm_target *ti,
20542039
iterate_devices_callout_fn fn, void *data)
20552040
{
@@ -2070,7 +2055,6 @@ static struct target_type crypt_target = {
20702055
.preresume = crypt_preresume,
20712056
.resume = crypt_resume,
20722057
.message = crypt_message,
2073-
.merge = crypt_merge,
20742058
.iterate_devices = crypt_iterate_devices,
20752059
};
20762060

drivers/md/dm-era-target.c

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1673,20 +1673,6 @@ static int era_iterate_devices(struct dm_target *ti,
16731673
return fn(ti, era->origin_dev, 0, get_dev_size(era->origin_dev), data);
16741674
}
16751675

1676-
static int era_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
1677-
struct bio_vec *biovec, int max_size)
1678-
{
1679-
struct era *era = ti->private;
1680-
struct request_queue *q = bdev_get_queue(era->origin_dev->bdev);
1681-
1682-
if (!q->merge_bvec_fn)
1683-
return max_size;
1684-
1685-
bvm->bi_bdev = era->origin_dev->bdev;
1686-
1687-
return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
1688-
}
1689-
16901676
static void era_io_hints(struct dm_target *ti, struct queue_limits *limits)
16911677
{
16921678
struct era *era = ti->private;
@@ -1717,7 +1703,6 @@ static struct target_type era_target = {
17171703
.status = era_status,
17181704
.message = era_message,
17191705
.iterate_devices = era_iterate_devices,
1720-
.merge = era_merge,
17211706
.io_hints = era_io_hints
17221707
};
17231708

drivers/md/dm-flakey.c

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -387,21 +387,6 @@ static int flakey_ioctl(struct dm_target *ti, unsigned int cmd, unsigned long ar
387387
return r ? : __blkdev_driver_ioctl(dev->bdev, dev->mode, cmd, arg);
388388
}
389389

390-
static int flakey_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
391-
struct bio_vec *biovec, int max_size)
392-
{
393-
struct flakey_c *fc = ti->private;
394-
struct request_queue *q = bdev_get_queue(fc->dev->bdev);
395-
396-
if (!q->merge_bvec_fn)
397-
return max_size;
398-
399-
bvm->bi_bdev = fc->dev->bdev;
400-
bvm->bi_sector = flakey_map_sector(ti, bvm->bi_sector);
401-
402-
return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
403-
}
404-
405390
static int flakey_iterate_devices(struct dm_target *ti, iterate_devices_callout_fn fn, void *data)
406391
{
407392
struct flakey_c *fc = ti->private;
@@ -419,7 +404,6 @@ static struct target_type flakey_target = {
419404
.end_io = flakey_end_io,
420405
.status = flakey_status,
421406
.ioctl = flakey_ioctl,
422-
.merge = flakey_merge,
423407
.iterate_devices = flakey_iterate_devices,
424408
};
425409

drivers/md/dm-linear.c

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -130,21 +130,6 @@ static int linear_ioctl(struct dm_target *ti, unsigned int cmd,
130130
return r ? : __blkdev_driver_ioctl(dev->bdev, dev->mode, cmd, arg);
131131
}
132132

133-
static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
134-
struct bio_vec *biovec, int max_size)
135-
{
136-
struct linear_c *lc = ti->private;
137-
struct request_queue *q = bdev_get_queue(lc->dev->bdev);
138-
139-
if (!q->merge_bvec_fn)
140-
return max_size;
141-
142-
bvm->bi_bdev = lc->dev->bdev;
143-
bvm->bi_sector = linear_map_sector(ti, bvm->bi_sector);
144-
145-
return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
146-
}
147-
148133
static int linear_iterate_devices(struct dm_target *ti,
149134
iterate_devices_callout_fn fn, void *data)
150135
{
@@ -162,7 +147,6 @@ static struct target_type linear_target = {
162147
.map = linear_map,
163148
.status = linear_status,
164149
.ioctl = linear_ioctl,
165-
.merge = linear_merge,
166150
.iterate_devices = linear_iterate_devices,
167151
};
168152

drivers/md/dm-log-writes.c

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -725,21 +725,6 @@ static int log_writes_ioctl(struct dm_target *ti, unsigned int cmd,
725725
return r ? : __blkdev_driver_ioctl(dev->bdev, dev->mode, cmd, arg);
726726
}
727727

728-
static int log_writes_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
729-
struct bio_vec *biovec, int max_size)
730-
{
731-
struct log_writes_c *lc = ti->private;
732-
struct request_queue *q = bdev_get_queue(lc->dev->bdev);
733-
734-
if (!q->merge_bvec_fn)
735-
return max_size;
736-
737-
bvm->bi_bdev = lc->dev->bdev;
738-
bvm->bi_sector = dm_target_offset(ti, bvm->bi_sector);
739-
740-
return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
741-
}
742-
743728
static int log_writes_iterate_devices(struct dm_target *ti,
744729
iterate_devices_callout_fn fn,
745730
void *data)
@@ -793,7 +778,6 @@ static struct target_type log_writes_target = {
793778
.end_io = normal_end_io,
794779
.status = log_writes_status,
795780
.ioctl = log_writes_ioctl,
796-
.merge = log_writes_merge,
797781
.message = log_writes_message,
798782
.iterate_devices = log_writes_iterate_devices,
799783
.io_hints = log_writes_io_hints,

0 commit comments

Comments
 (0)