mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 17:53:56 +08:00
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 <tj@kernel.org> Cc: Jens Axboe <axboe@kernel.dk> Cc: Nicholas A. Bellinger <nab@linux-iscsi.org> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
17737d3b59
commit
531ed6261e
@ -81,7 +81,7 @@ static int blk_mq_queue_enter(struct request_queue *q)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
__percpu_counter_add(&q->mq_usage_counter, 1, 1000000);
|
__percpu_counter_add(&q->mq_usage_counter, 1, 1000000);
|
||||||
smp_wmb();
|
smp_mb();
|
||||||
|
|
||||||
/* we have problems freezing the queue if it's initializing */
|
/* we have problems freezing the queue if it's initializing */
|
||||||
if (!blk_queue_dying(q) &&
|
if (!blk_queue_dying(q) &&
|
||||||
|
Loading…
Reference in New Issue
Block a user