Messages in this thread | | | Subject | Re: [PATCH v4 6/7] blk-mq: fix freeze queue race | From | Jens Axboe <> | Date | Tue, 29 Sep 2015 09:01:31 -0600 |
| |
On 09/28/2015 08:48 AM, Tejun Heo wrote: > Hello, > > On Sun, Sep 27, 2015 at 10:06:05PM +0900, Akinobu Mita wrote: >>>> void blk_mq_finish_init(struct request_queue *q) >>>> { >>>> + mutex_lock(&q->mq_freeze_lock); >>>> percpu_ref_switch_to_percpu(&q->mq_usage_counter); >>>> + mutex_unlock(&q->mq_freeze_lock); >>> >>> This looks weird to me. What can it race against at this point? >> >> The possible scenario is described in commit log (1. ~ 7.). In summary, >> blk_mq_finish_init() and blk_mq_freeze_queue_start() can be executed >> at the same time, so this is required to serialize the execution of >> percpu_ref_switch_to_percpu() by blk_mq_finish_init() and >> percpu_ref_kill() by blk_mq_freeze_queue_start(). > > Ah, you're right. I was thinking that percpu_ref_switch_to_percpu() > being called after blk_mq_freeze_queue_start() would be buggy and thus > the above can't be enough but that is safe as long as the calls are > properly synchronized. Hmmm... maybe we should add synchronization to > those operations from percpu_ref side.
I think that would be very useful, it seems sort of half-assed if the caller side has to provide serialization for that.
-- Jens Axboe
| |