| From 5318c41ffaf7d2d8c2bd2cecfa27ebebfa5fb0b7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 13 May 2020 17:50:34 -0700 |
| Subject: mm, memcg: fix inconsistent oom event behavior |
| |
| From: Yafang Shao <laoar.shao@gmail.com> |
| |
| [ Upstream commit 04fd61a4e01028210a91f0efc408c8bc61a3018c ] |
| |
| A recent commit 9852ae3fe529 ("mm, memcg: consider subtrees in |
| memory.events") changed the behavior of memcg events, which will now |
| consider subtrees in memory.events. |
| |
| But oom_kill event is a special one as it is used in both cgroup1 and |
| cgroup2. In cgroup1, it is displayed in memory.oom_control. The file |
| memory.oom_control is in both root memcg and non root memcg, that is |
| different with memory.event as it only in non-root memcg. That commit |
| is okay for cgroup2, but it is not okay for cgroup1 as it will cause |
| inconsistent behavior between root memcg and non-root memcg. |
| |
| Here's an example on why this behavior is inconsistent in cgroup1. |
| |
| root memcg |
| / |
| memcg foo |
| / |
| memcg bar |
| |
| Suppose there's an oom_kill in memcg bar, then the oon_kill will be |
| |
| root memcg : memory.oom_control(oom_kill) 0 |
| / |
| memcg foo : memory.oom_control(oom_kill) 1 |
| / |
| memcg bar : memory.oom_control(oom_kill) 1 |
| |
| For the non-root memcg, its memory.oom_control(oom_kill) includes its |
| descendants' oom_kill, but for root memcg, it doesn't include its |
| descendants' oom_kill. That means, memory.oom_control(oom_kill) has |
| different meanings in different memcgs. That is inconsistent. Then the |
| user has to know whether the memcg is root or not. |
| |
| If we can't fully support it in cgroup1, for example by adding |
| memory.events.local into cgroup1 as well, then let's don't touch its |
| original behavior. |
| |
| Fixes: 9852ae3fe529 ("mm, memcg: consider subtrees in memory.events") |
| Reported-by: Randy Dunlap <rdunlap@infradead.org> |
| Signed-off-by: Yafang Shao <laoar.shao@gmail.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Reviewed-by: Shakeel Butt <shakeelb@google.com> |
| Acked-by: Johannes Weiner <hannes@cmpxchg.org> |
| Acked-by: Chris Down <chris@chrisdown.name> |
| Acked-by: Michal Hocko <mhocko@suse.com> |
| Cc: <stable@vger.kernel.org> |
| Link: http://lkml.kernel.org/r/20200502141055.7378-1-laoar.shao@gmail.com |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/linux/memcontrol.h | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h |
| index e9ba01336d4e7..bc5a3621a9d7d 100644 |
| --- a/include/linux/memcontrol.h |
| +++ b/include/linux/memcontrol.h |
| @@ -783,6 +783,8 @@ static inline void memcg_memory_event(struct mem_cgroup *memcg, |
| atomic_long_inc(&memcg->memory_events[event]); |
| cgroup_file_notify(&memcg->events_file); |
| |
| + if (!cgroup_subsys_on_dfl(memory_cgrp_subsys)) |
| + break; |
| if (cgrp_dfl_root.flags & CGRP_ROOT_MEMORY_LOCAL_EVENTS) |
| break; |
| } while ((memcg = parent_mem_cgroup(memcg)) && |
| -- |
| 2.20.1 |
| |