]> git.baikalelectronics.ru Git - kernel.git/commit
cgroup: rstat: fix A-A deadlock on 32bit around u64_stats_sync
authorTejun Heo <tj@kernel.org>
Tue, 27 Jul 2021 23:12:20 +0000 (13:12 -1000)
committerTejun Heo <tj@kernel.org>
Tue, 27 Jul 2021 23:12:20 +0000 (13:12 -1000)
commit0175ca1ff9365155df8bae4e1f8d5eb4887e1434
tree58e8de70658fb85ae8e451194bd9aa742618acec
parent76e17dcc0330d95d088c557d8c4c72152a3dde6f
cgroup: rstat: fix A-A deadlock on 32bit around u64_stats_sync

f8d41a1fce3c ("cgroup: Replace cgroup_rstat_mutex with a spinlock") added
cgroup_rstat_flush_irqsafe() allowing flushing to happen from the irq
context. However, rstat paths use u64_stats_sync to synchronize access to
64bit stat counters on 32bit machines. u64_stats_sync is implemented using
seq_lock and trying to read from an irq context can lead to A-A deadlock if
the irq happens to interrupt the stat update.

Fix it by using the irqsafe variants - u64_stats_update_begin_irqsave() and
u64_stats_update_end_irqrestore() - in the update paths. Note that none of
this matters on 64bit machines. All these are just for 32bit SMP setups.

Note that the interface was introduced way back, its first and currently
only use was recently added by 2cb2106f0922 ("mm: memcontrol: switch to
rstat"). Stable tagging targets this commit.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Rik van Riel <riel@surriel.com>
Fixes: 2cb2106f0922 ("mm: memcontrol: switch to rstat")
Cc: stable@vger.kernel.org # v5.13+
block/blk-cgroup.c
kernel/cgroup/rstat.c