drbd: refactor the backing dev max_segments calculation
Factor out a drbd_backing_dev_max_segments helper that checks the backing device limitation. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Philipp Reisner <philipp.reisner@linbit.com> Reviewed-by: Lars Ellenberg <lars.ellenberg@linbit.com> Tested-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com> Link: https://lore.kernel.org/r/20240306140332.623759-4-philipp.reisner@linbit.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
342d81fde2
commit
2828908d5c
@ -1295,30 +1295,39 @@ static void fixup_discard_support(struct drbd_device *device, struct request_que
|
||||
}
|
||||
}
|
||||
|
||||
/* This is the workaround for "bio would need to, but cannot, be split" */
|
||||
static unsigned int drbd_backing_dev_max_segments(struct drbd_device *device)
|
||||
{
|
||||
unsigned int max_segments;
|
||||
|
||||
rcu_read_lock();
|
||||
max_segments = rcu_dereference(device->ldev->disk_conf)->max_bio_bvecs;
|
||||
rcu_read_unlock();
|
||||
|
||||
if (!max_segments)
|
||||
return BLK_MAX_SEGMENTS;
|
||||
return max_segments;
|
||||
}
|
||||
|
||||
static void drbd_setup_queue_param(struct drbd_device *device, struct drbd_backing_dev *bdev,
|
||||
unsigned int max_bio_size, struct o_qlim *o)
|
||||
{
|
||||
struct request_queue * const q = device->rq_queue;
|
||||
unsigned int max_hw_sectors = max_bio_size >> 9;
|
||||
unsigned int max_segments = 0;
|
||||
unsigned int max_segments = BLK_MAX_SEGMENTS;
|
||||
struct request_queue *b = NULL;
|
||||
struct disk_conf *dc;
|
||||
|
||||
if (bdev) {
|
||||
b = bdev->backing_bdev->bd_disk->queue;
|
||||
|
||||
max_hw_sectors = min(queue_max_hw_sectors(b), max_bio_size >> 9);
|
||||
rcu_read_lock();
|
||||
dc = rcu_dereference(device->ldev->disk_conf);
|
||||
max_segments = dc->max_bio_bvecs;
|
||||
rcu_read_unlock();
|
||||
max_segments = drbd_backing_dev_max_segments(device);
|
||||
|
||||
blk_set_stacking_limits(&q->limits);
|
||||
}
|
||||
|
||||
blk_queue_max_hw_sectors(q, max_hw_sectors);
|
||||
/* This is the workaround for "bio would need to, but cannot, be split" */
|
||||
blk_queue_max_segments(q, max_segments ? max_segments : BLK_MAX_SEGMENTS);
|
||||
blk_queue_max_segments(q, max_segments);
|
||||
blk_queue_segment_boundary(q, PAGE_SIZE-1);
|
||||
decide_on_discard_support(device, bdev);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user