summaryrefslogtreecommitdiffstats
path: root/fs/block_dev.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2013-05-14 13:52:31 -0700
committerTejun Heo <tj@kernel.org>2013-05-14 13:52:31 -0700
commit2a4fd070ee8561d918a3776388331bb7e92ea59e (patch)
tree53eb9c6df1ea0e02cb3f3442fb85f9e25a4691ed /fs/block_dev.c
parentdb61367038dcd222476881cb09fd54661b3cd508 (diff)
downloadlinux-2a4fd070ee8561d918a3776388331bb7e92ea59e.tar.gz
linux-2a4fd070ee8561d918a3776388331bb7e92ea59e.tar.bz2
linux-2a4fd070ee8561d918a3776388331bb7e92ea59e.zip
blkcg: move bulk of blkcg_gq release operations to the RCU callback
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: Tejun Heo <tj@kernel.org> Acked-by: Vivek Goyal <vgoyal@redhat.com>
Diffstat (limited to 'fs/block_dev.c')
0 files changed, 0 insertions, 0 deletions