lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Sat, 16 Aug 2014 21:30:36 +0800
From:	Ming Lei <ming.lei@...onical.com>
To:	Tejun Heo <tj@...nel.org>
Cc:	Jens Axboe <axboe@...nel.dk>, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] blk-mq: blk_mq_freeze_queue() should allow nesting

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ