Re: [PATCH v2 2/4] block: add a read barrier in blk_queue_enter()
From: Hannes Reinecke <hare@suse.de>
Date: 2017-03-24 15:20:04
On 03/24/2017 01:36 PM, Ming Lei wrote:
quoted hunk ↗ jump to hunk
Without the barrier, reading DEAD flag of .q_usage_counter and reading .mq_freeze_depth may be reordered, then the following wait_event_interruptible() may never return. Signed-off-by: Ming Lei <tom.leiming@gmail.com> --- block/blk-core.c | 8 ++++++++ 1 file changed, 8 insertions(+)diff --git a/block/blk-core.c b/block/blk-core.c index ad388d5e309a..44eed17319c0 100644 --- a/block/blk-core.c +++ b/block/blk-core.c@@ -669,6 +669,14 @@ int blk_queue_enter(struct request_queue *q, bool nowait) if (nowait) return -EBUSY; + /* + * read pair of barrier in blk_mq_freeze_queue_start(), + * we need to order reading DEAD flag of .q_usage_counter + * and reading .mq_freeze_depth, otherwise the following + * wait may never return if the two read are reordered. + */ + smp_rmb(); + ret = wait_event_interruptible(q->mq_freeze_wq, !atomic_read(&q->mq_freeze_depth) || blk_queue_dying(q));
Reviewed-by: Hannes Reinecke <hare@suse.com> Cheers, Hannes -- Dr. Hannes Reinecke zSeries & Storage hare@suse.de +49 911 74053 688 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N�rnberg GF: J. Hawn, J. Guild, F. Imend�rffer, HRB 16746 (AG N�rnberg)