Skip to content
  • Tejun Heo's avatar
    cgroup: rstat: fix A-A deadlock on 32bit around u64_stats_sync · c3df5fb5
    Tejun Heo authored
    0fa294fb ("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 2d146aa3
    
     ("mm: memcontrol: switch to
    rstat"). Stable tagging targets this commit.
    
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarRik van Riel <riel@surriel.com>
    Fixes: 2d146aa3 ("mm: memcontrol: switch to rstat")
    Cc: stable@vger.kernel.org # v5.13+
    c3df5fb5