block: pass in blk_mq_tags to blk_mq_rq_ctx_init()
authorJens Axboe <axboe@kernel.dk>
Tue, 19 Oct 2021 15:32:58 +0000 (09:32 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 27 Oct 2021 14:43:15 +0000 (08:43 -0600)
Instead of getting this from data for every invocation of request
initialization, pass it in as an argument instead.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
Link: https://lore.kernel.org/r/20211019153300.623322-3-axboe@kernel.dk
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.c

index a4d5b779a65a8a1bd5c07cf500f952a6eb8620b1..e881e12a2691eaa82fbcd21267e374c505a1bbc2 100644 (file)
@@ -316,12 +316,11 @@ void blk_mq_wake_waiters(struct request_queue *q)
 }
 
 static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data,
-               unsigned int tag, u64 alloc_time_ns)
+               struct blk_mq_tags *tags, unsigned int tag, u64 alloc_time_ns)
 {
        struct blk_mq_ctx *ctx = data->ctx;
        struct blk_mq_hw_ctx *hctx = data->hctx;
        struct request_queue *q = data->q;
-       struct blk_mq_tags *tags = blk_mq_tags_from_data(data);
        struct request *rq = tags->static_rqs[tag];
 
        if (!(data->rq_flags & RQF_ELV)) {
@@ -393,20 +392,22 @@ __blk_mq_alloc_requests_batch(struct blk_mq_alloc_data *data,
                u64 alloc_time_ns)
 {
        unsigned int tag, tag_offset;
+       struct blk_mq_tags *tags;
        struct request *rq;
-       unsigned long tags;
+       unsigned long tag_mask;
        int i, nr = 0;
 
-       tags = blk_mq_get_tags(data, data->nr_tags, &tag_offset);
-       if (unlikely(!tags))
+       tag_mask = blk_mq_get_tags(data, data->nr_tags, &tag_offset);
+       if (unlikely(!tag_mask))
                return NULL;
 
-       for (i = 0; tags; i++) {
-               if (!(tags & (1UL << i)))
+       tags = blk_mq_tags_from_data(data);
+       for (i = 0; tag_mask; i++) {
+               if (!(tag_mask & (1UL << i)))
                        continue;
                tag = tag_offset + i;
-               tags &= ~(1UL << i);
-               rq = blk_mq_rq_ctx_init(data, tag, alloc_time_ns);
+               tag_mask &= ~(1UL << i);
+               rq = blk_mq_rq_ctx_init(data, tags, tag, alloc_time_ns);
                rq_list_add(data->cached_rq, rq);
        }
        data->nr_tags -= nr;
@@ -477,7 +478,8 @@ retry:
                goto retry;
        }
 
-       return blk_mq_rq_ctx_init(data, tag, alloc_time_ns);
+       return blk_mq_rq_ctx_init(data, blk_mq_tags_from_data(data), tag,
+                                       alloc_time_ns);
 }
 
 struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op,
@@ -563,7 +565,8 @@ struct request *blk_mq_alloc_request_hctx(struct request_queue *q,
        tag = blk_mq_get_tag(&data);
        if (tag == BLK_MQ_NO_TAG)
                goto out_queue_exit;
-       return blk_mq_rq_ctx_init(&data, tag, alloc_time_ns);
+       return blk_mq_rq_ctx_init(&data, blk_mq_tags_from_data(&data), tag,
+                                       alloc_time_ns);
 
 out_queue_exit:
        blk_queue_exit(q);