block: skip q->rq_qos check in rq_qos_done_bio()
authorNilay Shroff <nilay@linux.ibm.com>
Thu, 14 Aug 2025 08:24:57 +0000 (13:54 +0530)
committerJens Axboe <axboe@kernel.dk>
Thu, 21 Aug 2025 13:11:11 +0000 (07:11 -0600)
If a bio has BIO_QOS_THROTTLED or BIO_QOS_MERGED set,
it implicitly guarantees that q->rq_qos is present.
Avoid re-checking q->rq_qos in this case and call
__rq_qos_done_bio() directly as a minor optimization.

Suggested-by : Yu Kuai <yukuai1@huaweicloud.com>

Signed-off-by: Nilay Shroff <nilay@linux.ibm.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Yu Kuai <yukuai3@huawei.com>
Link: https://lore.kernel.org/r/20250814082612.500845-2-nilay@linux.ibm.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-rq-qos.h

index 39749f4066fb107f57581e1b4f00730d38b1e064..28125fc49effc7043082b1f60611d23c16b69491 100644 (file)
@@ -142,8 +142,14 @@ static inline void rq_qos_done_bio(struct bio *bio)
            bio->bi_bdev && (bio_flagged(bio, BIO_QOS_THROTTLED) ||
                             bio_flagged(bio, BIO_QOS_MERGED))) {
                struct request_queue *q = bdev_get_queue(bio->bi_bdev);
-               if (q->rq_qos)
-                       __rq_qos_done_bio(q->rq_qos, bio);
+
+               /*
+                * If a bio has BIO_QOS_xxx set, it implicitly implies that
+                * q->rq_qos is present. So, we skip re-checking q->rq_qos
+                * here as an extra optimization and directly call
+                * __rq_qos_done_bio().
+                */
+               __rq_qos_done_bio(q->rq_qos, bio);
        }
 }