• D
    mm, memcg: protect mem_cgroup_read_events for cpu hotplug · 9c567512
    David Rientjes 提交于
    for_each_online_cpu() needs the protection of {get,put}_online_cpus() so
    cpu_online_mask doesn't change during the iteration.
    
    cpu_hotplug.lock is held while a cpu is going down, it's a coarse lock
    that is used kernel-wide to synchronize cpu hotplug activity.  Memcg has
    a cpu hotplug notifier, called while there may not be any cpu hotplug
    refcounts, which drains per-cpu event counts to memcg->nocpu_base.events
    to maintain a cumulative event count as cpus disappear.  Without
    get_online_cpus() in mem_cgroup_read_events(), it's possible to account
    for the event count on a dying cpu twice, and this value may be
    significantly large.
    
    In fact, all memcg->pcp_counter_lock use should be nested by
    {get,put}_online_cpus().
    
    This fixes that issue and ensures the reported statistics are not vastly
    over-reported during cpu hotplug.
    Signed-off-by: NDavid Rientjes <rientjes@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Acked-by: NKOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    9c567512
memcontrol.c 187.7 KB