summaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorJohannes Weiner <jweiner@fb.com>2016-09-19 14:44:36 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2016-09-19 15:36:17 -0700
commitdb2ba40c277dc545bab531671c3f45ac0afea6f8 (patch)
tree0a8cf97596ce97c77a4cf44e4ab8262cbdb429af /net/core
parent3bb8b653c86f6b1d2cc05aa1744fed4b18f99485 (diff)
downloadlinux-db2ba40c277dc545bab531671c3f45ac0afea6f8.tar.gz
linux-db2ba40c277dc545bab531671c3f45ac0afea6f8.tar.bz2
linux-db2ba40c277dc545bab531671c3f45ac0afea6f8.zip
mm: memcontrol: make per-cpu charge cache IRQ-safe for socket accounting
During cgroup2 rollout into production, we started encountering css refcount underflows and css access crashes in the memory controller. Splitting the heavily shared css reference counter into logical users narrowed the imbalance down to the cgroup2 socket memory accounting. The problem turns out to be the per-cpu charge cache. Cgroup1 had a separate socket counter, but the new cgroup2 socket accounting goes through the common charge path that uses a shared per-cpu cache for all memory that is being tracked. Those caches are safe against scheduling preemption, but not against interrupts - such as the newly added packet receive path. When cache draining is interrupted by network RX taking pages out of the cache, the resuming drain operation will put references of in-use pages, thus causing the imbalance. Disable IRQs during all per-cpu charge cache operations. Fixes: f7e1cb6ec51b ("mm: memcontrol: account socket memory in unified hierarchy memory controller") Link: http://lkml.kernel.org/r/20160914194846.11153-1-hannes@cmpxchg.org Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> Acked-by: Tejun Heo <tj@kernel.org> Cc: "David S. Miller" <davem@davemloft.net> Cc: Michal Hocko <mhocko@suse.cz> Cc: Vladimir Davydov <vdavydov@virtuozzo.com> Cc: <stable@vger.kernel.org> [4.5+] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'net/core')
0 files changed, 0 insertions, 0 deletions