Re: [PATCH] blk-mq: blk_mq_freeze_queue() should allow nesting

From: Ming Lei
Date: Sat Aug 16 2014 - 09:30:42 EST


On 8/16/14, Tejun Heo <tj@xxxxxxxxxx> 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 <tj@xxxxxxxxxx>
> Reported-by: Ming Lei <ming.lei@xxxxxxxxxxxxx>
> ---
> 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 majordomo@xxxxxxxxxxxxxxx
> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/