@@ -4405,11 +4405,8 @@ static int blk_mq_realloc_tag_set_tags(struct blk_mq_tag_set *set,
4405
4405
struct blk_mq_tags * * new_tags ;
4406
4406
int i ;
4407
4407
4408
- if (set -> nr_hw_queues >= new_nr_hw_queues ) {
4409
- for (i = new_nr_hw_queues ; i < set -> nr_hw_queues ; i ++ )
4410
- __blk_mq_free_map_and_rqs (set , i );
4408
+ if (set -> nr_hw_queues >= new_nr_hw_queues )
4411
4409
goto done ;
4412
- }
4413
4410
4414
4411
new_tags = kcalloc_node (new_nr_hw_queues , sizeof (struct blk_mq_tags * ),
4415
4412
GFP_KERNEL , set -> numa_node );
@@ -4719,7 +4716,8 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set,
4719
4716
{
4720
4717
struct request_queue * q ;
4721
4718
LIST_HEAD (head );
4722
- int prev_nr_hw_queues ;
4719
+ int prev_nr_hw_queues = set -> nr_hw_queues ;
4720
+ int i ;
4723
4721
4724
4722
lockdep_assert_held (& set -> tag_list_lock );
4725
4723
@@ -4746,7 +4744,6 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set,
4746
4744
blk_mq_sysfs_unregister_hctxs (q );
4747
4745
}
4748
4746
4749
- prev_nr_hw_queues = set -> nr_hw_queues ;
4750
4747
if (blk_mq_realloc_tag_set_tags (set , nr_hw_queues ) < 0 )
4751
4748
goto reregister ;
4752
4749
@@ -4781,6 +4778,10 @@ static void __blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set,
4781
4778
4782
4779
list_for_each_entry (q , & set -> tag_list , tag_set_list )
4783
4780
blk_mq_unfreeze_queue (q );
4781
+
4782
+ /* Free the excess tags when nr_hw_queues shrink. */
4783
+ for (i = set -> nr_hw_queues ; i < prev_nr_hw_queues ; i ++ )
4784
+ __blk_mq_free_map_and_rqs (set , i );
4784
4785
}
4785
4786
4786
4787
void blk_mq_update_nr_hw_queues (struct blk_mq_tag_set * set , int nr_hw_queues )
0 commit comments