]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
block: consider discard merge last
authorKeith Busch <kbusch@kernel.org>
Fri, 14 Nov 2025 18:31:45 +0000 (10:31 -0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 17 Nov 2025 16:39:36 +0000 (09:39 -0700)
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>
block/blk-merge.c

index d3115d7469df07f7b36b3cc9b0a7e494ce2e6150..db08bc90609165d08d337451a85a3bacd1e954e3 100644 (file)
@@ -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;
 }