]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
blk-mq: split bitmap grow and resize case in blk_mq_update_nr_requests()
authorYu Kuai <yukuai3@huawei.com>
Wed, 10 Sep 2025 08:04:41 +0000 (16:04 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 10 Sep 2025 11:25:56 +0000 (05:25 -0600)
No functional changes are intended, make code cleaner and prepare to fix
the grow case in following patches.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Nilay Shroff <nilay@linux.ibm.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.c

index 80c20700bce85b8efefa36449b1cf32bcd5aa822..299aac4581855e967edc80e3a9e39ccf8850cf0b 100644 (file)
@@ -4936,25 +4936,40 @@ int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr)
        blk_mq_quiesce_queue(q);
 
        if (blk_mq_is_shared_tags(set->flags)) {
+               /*
+                * Shared tags, for sched tags, we allocate max initially hence
+                * tags can't grow, see blk_mq_alloc_sched_tags().
+                */
                if (q->elevator)
                        blk_mq_tag_update_sched_shared_tags(q);
                else
                        blk_mq_tag_resize_shared_tags(set, nr);
-       } else {
+       } else if (!q->elevator) {
+               /*
+                * Non-shared hardware tags, nr is already checked from
+                * queue_requests_store() and tags can't grow.
+                */
                queue_for_each_hw_ctx(q, hctx, i) {
                        if (!hctx->tags)
                                continue;
-                       /*
-                        * If we're using an MQ scheduler, just update the
-                        * scheduler queue depth. This is similar to what the
-                        * old code would do.
-                        */
-                       if (hctx->sched_tags)
-                               ret = blk_mq_tag_update_depth(hctx,
-                                                       &hctx->sched_tags, nr);
-                       else
-                               ret = blk_mq_tag_update_depth(hctx,
-                                                       &hctx->tags, nr);
+                       sbitmap_queue_resize(&hctx->tags->bitmap_tags,
+                               nr - hctx->tags->nr_reserved_tags);
+               }
+       } else if (nr <= q->elevator->et->nr_requests) {
+               /* Non-shared sched tags, and tags don't grow. */
+               queue_for_each_hw_ctx(q, hctx, i) {
+                       if (!hctx->sched_tags)
+                               continue;
+                       sbitmap_queue_resize(&hctx->sched_tags->bitmap_tags,
+                               nr - hctx->sched_tags->nr_reserved_tags);
+               }
+       } else {
+               /* Non-shared sched tags, and tags grow */
+               queue_for_each_hw_ctx(q, hctx, i) {
+                       if (!hctx->sched_tags)
+                               continue;
+                       ret = blk_mq_tag_update_depth(hctx, &hctx->sched_tags,
+                                                     nr);
                        if (ret)
                                goto out;
                }