On Thu, 2019-04-04 at 16:43 +0800, Ming Lei wrote:
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index b512ba0cb359..41c12d9008b7 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -3224,8 +3224,11 @@ static void __blk_mq_update_nr_hw_queues(struct 
> blk_mq_tag_set *set,
>         if (nr_hw_queues < 1 || nr_hw_queues == set->nr_hw_queues)
>                 return;
>  
> -       list_for_each_entry(q, &set->tag_list, tag_set_list)
> +       list_for_each_entry(q, &set->tag_list, tag_set_list) {
>                 blk_mq_freeze_queue(q);
> +               blk_mq_quiesce_queue(q);
> +               blk_sync_queue(q);
> +       }
>         /*
>          * Sync with blk_mq_queue_tag_busy_iter.
>          */
> @@ -3269,8 +3272,10 @@ static void __blk_mq_update_nr_hw_queues(struct 
> blk_mq_tag_set *set,
>         list_for_each_entry(q, &set->tag_list, tag_set_list)
>                 blk_mq_elv_switch_back(&head, q);
>  
> -       list_for_each_entry(q, &set->tag_list, tag_set_list)
> +       list_for_each_entry(q, &set->tag_list, tag_set_list) {
> +               blk_mq_unquiesce_queue(q);
>                 blk_mq_unfreeze_queue(q);
> +       }
>  }
>  
>  void blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, int nr_hw_queues)

Are you sure this patch is sufficient? What prevents that blk_mq_run_hw_queues()
gets called after the blk_mq_quiesce() and blk_sync_queue() calls have finished
and before the queue is unfrozen?

Bart.

Reply via email to