Skip to content
  • Tejun Heo's avatar
    blkcg: move bulk of blkcg_gq release operations to the RCU callback · 2a4fd070
    Tejun Heo authored
    
    
    Currently, when the last reference of a blkcg_gq is put, all then
    release operations sans the actual freeing happen directly in
    blkg_put().  As blkg_put() may be called under queue_lock, all
    pd_exit_fn()s may be too.  This makes it impossible for pd_exit_fn()s
    to use del_timer_sync() on timers which grab the queue_lock which is
    an irq-safe lock due to the deadlock possibility described in the
    comment on top of del_timer_sync().
    
    This can be easily avoided by perfoming the release operations in the
    RCU callback instead of directly from blkg_put().  This patch moves
    the blkcg_gq release operations to the RCU callback.
    
    As this leaves __blkg_release() with only call_rcu() invocation,
    blkg_rcu_free() is renamed to __blkg_release_rcu(), exported and
    call_rcu() invocation is now done directly from blkg_put() instead of
    going through __blkg_release() which is removed.
    
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarVivek Goyal <vgoyal@redhat.com>
    2a4fd070