blk-mq: Some tag allocation code refactoring
authorJohn Garry <john.garry@huawei.com>
Thu, 13 May 2021 12:00:57 +0000 (20:00 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 24 May 2021 12:47:22 +0000 (06:47 -0600)
The tag allocation code to alloc the sbitmap pairs is common for regular
bitmaps tags and shared sbitmap, so refactor into a common function.

Also remove superfluous "flags" argument from blk_mq_init_shared_sbitmap().

Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Link: https://lore.kernel.org/r/1620907258-30910-2-git-send-email-john.garry@huawei.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq-tag.c
block/blk-mq-tag.h
block/blk-mq.c

index 1671dae43030b3c90f9f4a8d8ae1a558c4d68dd6..f597d40de10bc9d91c450525039d1c03deb74ab9 100644 (file)
@@ -471,39 +471,54 @@ static int bt_alloc(struct sbitmap_queue *bt, unsigned int depth,
                                       node);
 }
 
-static int blk_mq_init_bitmap_tags(struct blk_mq_tags *tags,
-                                  int node, int alloc_policy)
+int blk_mq_init_bitmaps(struct sbitmap_queue *bitmap_tags,
+                       struct sbitmap_queue *breserved_tags,
+                       unsigned int queue_depth, unsigned int reserved,
+                       int node, int alloc_policy)
 {
-       unsigned int depth = tags->nr_tags - tags->nr_reserved_tags;
+       unsigned int depth = queue_depth - reserved;
        bool round_robin = alloc_policy == BLK_TAG_ALLOC_RR;
 
-       if (bt_alloc(&tags->__bitmap_tags, depth, round_robin, node))
+       if (bt_alloc(bitmap_tags, depth, round_robin, node))
                return -ENOMEM;
-       if (bt_alloc(&tags->__breserved_tags, tags->nr_reserved_tags,
-                    round_robin, node))
+       if (bt_alloc(breserved_tags, reserved, round_robin, node))
                goto free_bitmap_tags;
 
+       return 0;
+
+free_bitmap_tags:
+       sbitmap_queue_free(bitmap_tags);
+       return -ENOMEM;
+}
+
+static int blk_mq_init_bitmap_tags(struct blk_mq_tags *tags,
+                                  int node, int alloc_policy)
+{
+       int ret;
+
+       ret = blk_mq_init_bitmaps(&tags->__bitmap_tags,
+                                 &tags->__breserved_tags,
+                                 tags->nr_tags, tags->nr_reserved_tags,
+                                 node, alloc_policy);
+       if (ret)
+               return ret;
+
        tags->bitmap_tags = &tags->__bitmap_tags;
        tags->breserved_tags = &tags->__breserved_tags;
 
        return 0;
-free_bitmap_tags:
-       sbitmap_queue_free(&tags->__bitmap_tags);
-       return -ENOMEM;
 }
 
-int blk_mq_init_shared_sbitmap(struct blk_mq_tag_set *set, unsigned int flags)
+int blk_mq_init_shared_sbitmap(struct blk_mq_tag_set *set)
 {
-       unsigned int depth = set->queue_depth - set->reserved_tags;
        int alloc_policy = BLK_MQ_FLAG_TO_ALLOC_POLICY(set->flags);
-       bool round_robin = alloc_policy == BLK_TAG_ALLOC_RR;
-       int i, node = set->numa_node;
+       int i, ret;
 
-       if (bt_alloc(&set->__bitmap_tags, depth, round_robin, node))
-               return -ENOMEM;
-       if (bt_alloc(&set->__breserved_tags, set->reserved_tags,
-                    round_robin, node))
-               goto free_bitmap_tags;
+       ret = blk_mq_init_bitmaps(&set->__bitmap_tags, &set->__breserved_tags,
+                                 set->queue_depth, set->reserved_tags,
+                                 set->numa_node, alloc_policy);
+       if (ret)
+               return ret;
 
        for (i = 0; i < set->nr_hw_queues; i++) {
                struct blk_mq_tags *tags = set->tags[i];
@@ -513,9 +528,6 @@ int blk_mq_init_shared_sbitmap(struct blk_mq_tag_set *set, unsigned int flags)
        }
 
        return 0;
-free_bitmap_tags:
-       sbitmap_queue_free(&set->__bitmap_tags);
-       return -ENOMEM;
 }
 
 void blk_mq_exit_shared_sbitmap(struct blk_mq_tag_set *set)
index f887988e5ef60339a0f62f190cc9dee8a1d5c921..8ed55af084273ffac2f6012073bbccf3a3e59aac 100644 (file)
@@ -32,11 +32,14 @@ extern struct blk_mq_tags *blk_mq_init_tags(unsigned int nr_tags,
                                        unsigned int reserved_tags,
                                        int node, unsigned int flags);
 extern void blk_mq_free_tags(struct blk_mq_tags *tags, unsigned int flags);
+extern int blk_mq_init_bitmaps(struct sbitmap_queue *bitmap_tags,
+                              struct sbitmap_queue *breserved_tags,
+                              unsigned int queue_depth,
+                              unsigned int reserved,
+                              int node, int alloc_policy);
 
-extern int blk_mq_init_shared_sbitmap(struct blk_mq_tag_set *set,
-                                     unsigned int flags);
+extern int blk_mq_init_shared_sbitmap(struct blk_mq_tag_set *set);
 extern void blk_mq_exit_shared_sbitmap(struct blk_mq_tag_set *set);
-
 extern unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data);
 extern void blk_mq_put_tag(struct blk_mq_tags *tags, struct blk_mq_ctx *ctx,
                           unsigned int tag);
index fbb1653937900f088787a3b20f3796f414e28419..001e196bdebd6d83549b20c1f236cfad5c888ab1 100644 (file)
@@ -3564,7 +3564,7 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)
        if (blk_mq_is_sbitmap_shared(set->flags)) {
                atomic_set(&set->active_queues_shared_sbitmap, 0);
 
-               if (blk_mq_init_shared_sbitmap(set, set->flags)) {
+               if (blk_mq_init_shared_sbitmap(set)) {
                        ret = -ENOMEM;
                        goto out_free_mq_rq_maps;
                }