summaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorKeith Busch <kbusch@kernel.org>2025-11-14 10:31:45 -0800
committerJens Axboe <axboe@kernel.dk>2025-11-17 09:39:36 -0700
commit2516c246d01c23a5f5310e9ac78d9f8aad9b1d0e (patch)
tree29dccf7ad42938f0f72783c352e196a73d733db0 /block
parent82d20481024cbae2ea87fe8b86d12961bfda7169 (diff)
block: consider discard merge last
If the next discard range is contiguous with the current range being considered, it's cheaper to expand the current range than to append an additional bio. Signed-off-by: Keith Busch <kbusch@kernel.org> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
-rw-r--r--block/blk-merge.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/block/blk-merge.c b/block/blk-merge.c
index d3115d7469df..db08bc906091 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -712,10 +712,10 @@ static void blk_account_io_merge_request(struct request *req)
static enum elv_merge blk_try_req_merge(struct request *req,
struct request *next)
{
- if (blk_discard_mergable(req))
- return ELEVATOR_DISCARD_MERGE;
- else if (blk_rq_pos(req) + blk_rq_sectors(req) == blk_rq_pos(next))
+ if (blk_rq_pos(req) + blk_rq_sectors(req) == blk_rq_pos(next))
return ELEVATOR_BACK_MERGE;
+ else if (blk_discard_mergable(req))
+ return ELEVATOR_DISCARD_MERGE;
return ELEVATOR_NO_MERGE;
}
@@ -903,12 +903,12 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
enum elv_merge blk_try_merge(struct request *rq, struct bio *bio)
{
- if (blk_discard_mergable(rq))
- return ELEVATOR_DISCARD_MERGE;
- else if (blk_rq_pos(rq) + blk_rq_sectors(rq) == bio->bi_iter.bi_sector)
+ if (blk_rq_pos(rq) + blk_rq_sectors(rq) == bio->bi_iter.bi_sector)
return ELEVATOR_BACK_MERGE;
else if (blk_rq_pos(rq) - bio_sectors(bio) == bio->bi_iter.bi_sector)
return ELEVATOR_FRONT_MERGE;
+ else if (blk_discard_mergable(rq))
+ return ELEVATOR_DISCARD_MERGE;
return ELEVATOR_NO_MERGE;
}