From: Tejun Heo Date: Wed, 18 Jun 2014 15:21:08 +0000 (-0400) Subject: blk-mq: fix a memory ordering bug in blk_mq_queue_enter() X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=531ed6261e7466907418b1a9971a5c71d7d250e4;p=GitHub%2Fmoto-9609%2Fandroid_kernel_motorola_exynos9610.git blk-mq: fix a memory ordering bug in blk_mq_queue_enter() blk-mq uses a percpu_counter to keep track of how many usages are in flight. The percpu_counter is drained while freezing to ensure that no usage is left in-flight after freezing is complete. blk_mq_queue_enter/exit() and blk_mq_[un]freeze_queue() implement this per-cpu gating mechanism; unfortunately, it contains a subtle bug - smp_wmb() in blk_mq_queue_enter() doesn't prevent prevent the cpu from fetching @q->bypass_depth before incrementing @q->mq_usage_counter and if freezing happens inbetween the caller can slip through and freezing can be complete while there are active users. Use smp_mb() instead so that bypass_depth and mq_usage_counter modifications and tests are properly interlocked. Signed-off-by: Tejun Heo Cc: Jens Axboe Cc: Nicholas A. Bellinger Signed-off-by: Jens Axboe --- diff --git a/block/blk-mq.c b/block/blk-mq.c index ad69ef657e85..9541f5111ba6 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -81,7 +81,7 @@ static int blk_mq_queue_enter(struct request_queue *q) int ret; __percpu_counter_add(&q->mq_usage_counter, 1, 1000000); - smp_wmb(); + smp_mb(); /* we have problems freezing the queue if it's initializing */ if (!blk_queue_dying(q) &&