]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
block: optimize I/O merge hot path with unlikely() hints
authorSteven Feng <steven@joint-cloud.com>
Sat, 6 Jun 2026 02:42:18 +0000 (10:42 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 8 Jun 2026 13:46:58 +0000 (07:46 -0600)
Remove redundant '== false' comparisons and add unlikely() branch
prediction hints in block I/O merge path functions.

These functions (ll_new_hw_segment, ll_merge_requests_fn, and
blk_rq_merge_ok) are executed on every I/O request merge attempt,
making them critical hot paths. Data integrity check failures are
rare events, so marking these conditions as unlikely() helps the
CPU optimize the common case by improving branch prediction.

Changes:
- Replace 'func() == false' with 'unlikely(!func())' for better
  code style and branch prediction

This micro-optimization reduces branch misprediction penalties in
high-frequency I/O merge paths.

Signed-off-by: Steven Feng <steven@joint-cloud.com>
Link: https://patch.msgid.link/tencent_79B652BD0CC23E093F27914380F161E7E505@qq.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-merge.c

index 7cc82a7a6f4ef0dbfb920d4b3d999f8b438187f8..ee1d9213f43ebe3346ad53dd681f5e13b99f7516 100644 (file)
@@ -545,7 +545,7 @@ static inline int ll_new_hw_segment(struct request *req, struct bio *bio,
        if (!blk_cgroup_mergeable(req, bio))
                goto no_merge;
 
-       if (blk_integrity_merge_bio(req->q, req, bio) == false)
+       if (unlikely(!blk_integrity_merge_bio(req->q, req, bio)))
                goto no_merge;
 
        /* discard request merge won't add new segment */
@@ -647,7 +647,7 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
        if (!blk_cgroup_mergeable(req, next->bio))
                return 0;
 
-       if (blk_integrity_merge_rq(q, req, next) == false)
+       if (unlikely(!blk_integrity_merge_rq(q, req, next)))
                return 0;
 
        if (!bio_crypt_ctx_merge_rq(req, next))
@@ -903,7 +903,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
 
        if (!blk_cgroup_mergeable(rq, bio))
                return false;
-       if (blk_integrity_merge_bio(rq->q, rq, bio) == false)
+       if (unlikely(!blk_integrity_merge_bio(rq->q, rq, bio)))
                return false;
        if (!bio_crypt_rq_ctx_compatible(rq, bio))
                return false;
@@ -913,7 +913,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
                return false;
        if (rq->bio->bi_ioprio != bio->bi_ioprio)
                return false;
-       if (blk_atomic_write_mergeable_rq_bio(rq, bio) == false)
+       if (unlikely(!blk_atomic_write_mergeable_rq_bio(rq, bio)))
                return false;
 
        return true;