| From 73439214e1b90b7135fb0f9e825591f5c6164217 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 13 Nov 2020 22:52:13 -0800 |
| Subject: mm: memcontrol: fix missing wakeup polling thread |
| |
| From: Muchun Song <songmuchun@bytedance.com> |
| |
| [ Upstream commit 8b21ca0218d29cc6bb7028125c7e5a10dfb4730c ] |
| |
| When we poll the swap.events, we can miss being woken up when the swap |
| event occurs. Because we didn't notify. |
| |
| Fixes: f3a53a3a1e5b ("mm, memcontrol: implement memory.swap.events") |
| Signed-off-by: Muchun Song <songmuchun@bytedance.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Reviewed-by: Shakeel Butt <shakeelb@google.com> |
| Acked-by: Johannes Weiner <hannes@cmpxchg.org> |
| Cc: Roman Gushchin <guro@fb.com> |
| Cc: Michal Hocko <mhocko@suse.com> |
| Cc: Yafang Shao <laoar.shao@gmail.com> |
| Cc: Chris Down <chris@chrisdown.name> |
| Cc: Tejun Heo <tj@kernel.org> |
| Link: https://lkml.kernel.org/r/20201105161936.98312-1-songmuchun@bytedance.com |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/linux/memcontrol.h | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h |
| index d0b036123c6ab..fa635207fe96d 100644 |
| --- a/include/linux/memcontrol.h |
| +++ b/include/linux/memcontrol.h |
| @@ -897,12 +897,19 @@ static inline void count_memcg_event_mm(struct mm_struct *mm, |
| static inline void memcg_memory_event(struct mem_cgroup *memcg, |
| enum memcg_memory_event event) |
| { |
| + bool swap_event = event == MEMCG_SWAP_HIGH || event == MEMCG_SWAP_MAX || |
| + event == MEMCG_SWAP_FAIL; |
| + |
| atomic_long_inc(&memcg->memory_events_local[event]); |
| - cgroup_file_notify(&memcg->events_local_file); |
| + if (!swap_event) |
| + cgroup_file_notify(&memcg->events_local_file); |
| |
| do { |
| atomic_long_inc(&memcg->memory_events[event]); |
| - cgroup_file_notify(&memcg->events_file); |
| + if (swap_event) |
| + cgroup_file_notify(&memcg->swap_events_file); |
| + else |
| + cgroup_file_notify(&memcg->events_file); |
| |
| if (!cgroup_subsys_on_dfl(memory_cgrp_subsys)) |
| break; |
| -- |
| 2.27.0 |
| |