On 4/6/20 12:36 PM, Weiping Zhang wrote:
For this error handle, it should free both map and request,
otherwise memleak occur.
^^^^^^^
Please expand this into "a memory leak".
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 4692e8232699..406df9ce9b55 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -2990,7 +2990,7 @@ static int __blk_mq_alloc_rq_map_and_requests(struct blk_mq_tag_set *set)
out_unwind:
while (--i >= 0)
- blk_mq_free_rq_map(set->tags[i]);
+ blk_mq_free_map_and_requests(set, i);
return -ENOMEM;
}
The current upstream implementation is as follows:
static int __blk_mq_alloc_rq_maps(struct blk_mq_tag_set *set)
{
int i;
for (i = 0; i < set->nr_hw_queues; i++)
if (!__blk_mq_alloc_rq_map(set, i))
goto out_unwind;
return 0;
out_unwind:
while (--i >= 0)
blk_mq_free_rq_map(set->tags[i]);
return -ENOMEM;
}
The pointers to the memory allocated by __blk_mq_alloc_rq_map() are
stored in set->tags[i] and set->tags[i]->static_rqs.
blk_mq_free_rq_map() frees set->tags[i]->static_rqs and set->tags[i]. In
other words, I don't see which memory is leaked. What did I miss?
Thanks,
Bart.