Skip to content

Commit e1dd7bc

Browse files
Chengming Zhouaxboe
authored andcommitted
blk-mq: fix tags leak when shrink nr_hw_queues
Although we don't need to realloc set->tags[] when shrink nr_hw_queues, we need to free them. Or these tags will be leaked. How to reproduce: 1. mount -t configfs configfs /mnt 2. modprobe null_blk nr_devices=0 submit_queues=8 3. mkdir /mnt/nullb/nullb0 4. echo 1 > /mnt/nullb/nullb0/power 5. echo 4 > /mnt/nullb/nullb0/submit_queues 6. rmdir /mnt/nullb/nullb0 In step 4, will alloc 9 tags (8 submit queues and 1 poll queue), then in step 5, new_nr_hw_queues = 5 (4 submit queues and 1 poll queue). At last in step 6, only these 5 tags are freed, the other 4 tags leaked. Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com> Reviewed-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20230821095602.70742-1-chengming.zhou@linux.dev Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 851e062 commit e1dd7bc

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

block/blk-mq.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4379,9 +4379,13 @@ static int blk_mq_realloc_tag_set_tags(struct blk_mq_tag_set *set,
43794379
int new_nr_hw_queues)
43804380
{
43814381
struct blk_mq_tags **new_tags;
4382+
int i;
43824383

4383-
if (set->nr_hw_queues >= new_nr_hw_queues)
4384+
if (set->nr_hw_queues >= new_nr_hw_queues) {
4385+
for (i = new_nr_hw_queues; i < set->nr_hw_queues; i++)
4386+
__blk_mq_free_map_and_rqs(set, i);
43844387
goto done;
4388+
}
43854389

43864390
new_tags = kcalloc_node(new_nr_hw_queues, sizeof(struct blk_mq_tags *),
43874391
GFP_KERNEL, set->numa_node);

0 commit comments

Comments
 (0)