block: inline fast path of driver tag allocation
authorJens Axboe <axboe@kernel.dk>
Wed, 13 Oct 2021 14:28:14 +0000 (08:28 -0600)
committerJens Axboe <axboe@kernel.dk>
Tue, 19 Oct 2021 21:18:25 +0000 (15:18 -0600)
If we don't use an IO scheduler or have shared tags, then we don't need
to call into this external function at all. This saves ~2% for such
a setup.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.c
block/blk-mq.h

index 3481a87..bf5936d 100644 (file)
@@ -1324,7 +1324,7 @@ struct request *blk_mq_dequeue_from_ctx(struct blk_mq_hw_ctx *hctx,
        return data.rq;
 }
 
-static bool __blk_mq_get_driver_tag(struct request *rq)
+static bool __blk_mq_alloc_driver_tag(struct request *rq)
 {
        struct sbitmap_queue *bt = &rq->mq_hctx->tags->bitmap_tags;
        unsigned int tag_offset = rq->mq_hctx->tags->nr_reserved_tags;
@@ -1348,11 +1348,9 @@ static bool __blk_mq_get_driver_tag(struct request *rq)
        return true;
 }
 
-bool blk_mq_get_driver_tag(struct request *rq)
+bool __blk_mq_get_driver_tag(struct blk_mq_hw_ctx *hctx, struct request *rq)
 {
-       struct blk_mq_hw_ctx *hctx = rq->mq_hctx;
-
-       if (rq->tag == BLK_MQ_NO_TAG && !__blk_mq_get_driver_tag(rq))
+       if (rq->tag == BLK_MQ_NO_TAG && !__blk_mq_alloc_driver_tag(rq))
                return false;
 
        if ((hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED) &&
index ebf67f4..d8ccb34 100644 (file)
@@ -258,7 +258,20 @@ static inline void blk_mq_put_driver_tag(struct request *rq)
        __blk_mq_put_driver_tag(rq->mq_hctx, rq);
 }
 
-bool blk_mq_get_driver_tag(struct request *rq);
+bool __blk_mq_get_driver_tag(struct blk_mq_hw_ctx *hctx, struct request *rq);
+
+static inline bool blk_mq_get_driver_tag(struct request *rq)
+{
+       struct blk_mq_hw_ctx *hctx = rq->mq_hctx;
+
+       if (rq->tag != BLK_MQ_NO_TAG &&
+           !(hctx->flags & BLK_MQ_F_TAG_QUEUE_SHARED)) {
+               hctx->tags->rqs[rq->tag] = rq;
+               return true;
+       }
+
+       return __blk_mq_get_driver_tag(hctx, rq);
+}
 
 static inline void blk_mq_clear_mq_map(struct blk_mq_queue_map *qmap)
 {