• Tejun Heo's avatar
    blk-mq: use percpu_ref for mq usage count · add703fd
    Tejun Heo authored
    Currently, 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.
    
    This type of code has relatively high chance of subtle bugs which are
    extremely difficult to trigger and it's way too hairy to be open coded
    in blk-mq.  percpu_ref can serve the same purpose after the recent
    changes.  This patch replaces the open-coded per-cpu usage counting
    and draining mechanism with percpu_ref.
    
    blk_mq_queue_enter() performs tryget_live on the ref and exit()
    performs put.  blk_mq_freeze_queue() kills the ref and waits until the
    reference count reaches zero.  blk_mq_unfreeze_queue() revives the ref
    and wakes up the waiters.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Nicholas A. Bellinger <nab@linux-iscsi.org>
    Cc: Kent Overstreet <kmo@daterainc.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    add703fd
blk-mq.c 46.3 KB