Message ID | 20230821095602.70742-3-chengming.zhou@linux.dev (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/3] blk-mq: fix tags leak when shrink nr_hw_queues | expand |
On Mon, Aug 21, 2023 at 05:56:02PM +0800, chengming.zhou@linux.dev wrote: > From: Chengming Zhou <zhouchengming@bytedance.com> > > Just like blk_mq_alloc_tag_set(), it's better to prepare all tags before > using to map to queue ctxs in blk_mq_map_swqueue(), which now have to > consider empty set->tags[]. > > The good point is that we can fallback easily if increasing nr_hw_queues > fail, instead of just mapping to hctx[0] when fail in blk_mq_map_swqueue(). > > And the fallback path already has tags free & clean handling, so all > is good. > > Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com> Reviewed-by: Ming Lei <ming.lei@redhat.com>
diff --git a/block/blk-mq.c b/block/blk-mq.c index 8d02bafff331..84adb3657b30 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -4404,6 +4404,16 @@ static int blk_mq_realloc_tag_set_tags(struct blk_mq_tag_set *set, sizeof(*set->tags)); kfree(set->tags); set->tags = new_tags; + + for (i = set->nr_hw_queues; i < new_nr_hw_queues; i++) { + if (!__blk_mq_alloc_map_and_rqs(set, i)) { + while (--i >= set->nr_hw_queues) + __blk_mq_free_map_and_rqs(set, i); + return -ENOMEM; + } + cond_resched(); + } + done: set->nr_hw_queues = new_nr_hw_queues; return 0;