On 8/16/14, Tejun Heo <t...@kernel.org> wrote:
> While converting to percpu_ref for freezing, add703fda981 ("blk-mq:
> use percpu_ref for mq usage count") incorrectly made
> blk_mq_freeze_queue() misbehave when freezing is nested due to
> percpu_ref_kill() being invoked on an already killed ref.
>
> Fix it by making blk_mq_freeze_queue() kill and kick the queue only
> for the outermost freeze attempt.  All the nested ones can simply wait
> for the ref to reach zero.
>
> While at it, remove unnecessary @wake initialization from
> blk_mq_unfreeze_queue().
>
> Signed-off-by: Tejun Heo <t...@kernel.org>
> Reported-by: Ming Lei <ming....@canonical.com>
> ---
> Hello, Ming, Jens.
>
> I think something like this is the correct solution.  Freezing should
> be nestable after all.  Ming, can you please verify whether this fixes
> the issue you're seeing?

This patch can fix the warning too, and I think freezing should be nestable,
and in my another patch they are exported.

Thanks,

> Thanks.
>
>  block/blk-mq.c |   12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 5189cb1..5978088 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -112,18 +112,22 @@ static void blk_mq_usage_counter_release(struct
> percpu_ref *ref)
>   */
>  void blk_mq_freeze_queue(struct request_queue *q)
>  {
> +     bool freeze;
> +
>       spin_lock_irq(q->queue_lock);
> -     q->mq_freeze_depth++;
> +     freeze = !q->mq_freeze_depth++;
>       spin_unlock_irq(q->queue_lock);
>
> -     percpu_ref_kill(&q->mq_usage_counter);
> -     blk_mq_run_queues(q, false);
> +     if (freeze) {
> +             percpu_ref_kill(&q->mq_usage_counter);
> +             blk_mq_run_queues(q, false);
> +     }
>       wait_event(q->mq_freeze_wq, percpu_ref_is_zero(&q->mq_usage_counter));
>  }
>
>  static void blk_mq_unfreeze_queue(struct request_queue *q)
>  {
> -     bool wake = false;
> +     bool wake;
>
>       spin_lock_irq(q->queue_lock);
>       wake = !--q->mq_freeze_depth;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>


-- 
Ming Lei
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to