block: only mark bio as tracked if it really is tracked
authorJens Axboe <axboe@kernel.dk>
Sat, 16 Oct 2021 02:06:18 +0000 (20:06 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Jul 2022 14:34:57 +0000 (16:34 +0200)
[ Upstream commit 90b8faa0e8de1b02b619fb33f6c6e1e13e7d1d70 ]

We set BIO_TRACKED unconditionally when rq_qos_throttle() is called, even
though we may not even have an rq_qos handler. Only mark it as TRACKED if
it really is potentially tracked.

This saves considerable time for the case where the bio isn't tracked:

     2.64%     -1.65%  [kernel.vmlinux]  [k] bio_endio

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
block/blk-rq-qos.h

index f000f83..3cfbc86 100644 (file)
@@ -189,9 +189,10 @@ static inline void rq_qos_throttle(struct request_queue *q, struct bio *bio)
         * BIO_TRACKED lets controllers know that a bio went through the
         * normal rq_qos path.
         */
-       bio_set_flag(bio, BIO_TRACKED);
-       if (q->rq_qos)
+       if (q->rq_qos) {
+               bio_set_flag(bio, BIO_TRACKED);
                __rq_qos_throttle(q->rq_qos, bio);
+       }
 }
 
 static inline void rq_qos_track(struct request_queue *q, struct request *rq,