Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

memcg, oom: remove explicit wakeup in mem_cgroup_oom_synchronize()

Before commit 29ef680ae7c2 ("memcg, oom: move out_of_memory back to the
charge path"), all memcg oom killers were delayed to page fault path. And
the explicit wakeup is used in this case:

thread A:
...
if (locked) { // complete oom-kill, hold the lock
mem_cgroup_oom_unlock(memcg);
...
}
...

thread B:
...

if (locked && !memcg->oom_kill_disable) {
...
} else {
schedule(); // can't acquire the lock
...
}
...

The reason is that thread A kicks off the OOM-killer, which leads to
wakeups from the uncharges of the exiting task. But thread B is not
guaranteed to see them if it enters the OOM path after the OOM kills but
before thread A releases the lock.

Now only oom_kill_disable case is handled from the #PF path. In that case
it is userspace to trigger the wake up not the #PF path itself. All
potential paths to free some charges are responsible to call
memcg_oom_recover() , so the explicit wakeup is not needed in the
mem_cgroup_oom_synchronize() path which doesn't release any memory itself.

Link: https://lkml.kernel.org/r/20230419030739.115845-2-haifeng.xu@shopee.com
Signed-off-by: Haifeng Xu <haifeng.xu@shopee.com>
Suggested-by: Michal Hocko <mhocko@suse.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Shakeel Butt <shakeelb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Haifeng Xu and committed by
Andrew Morton
18b1d18b 857f2139

+1 -8
+1 -8
mm/memcontrol.c
··· 2028 2028 mem_cgroup_unmark_under_oom(memcg); 2029 2029 finish_wait(&memcg_oom_waitq, &owait.wait); 2030 2030 2031 - if (locked) { 2031 + if (locked) 2032 2032 mem_cgroup_oom_unlock(memcg); 2033 - /* 2034 - * There is no guarantee that an OOM-lock contender 2035 - * sees the wakeups triggered by the OOM kill 2036 - * uncharges. Wake any sleepers explicitly. 2037 - */ 2038 - memcg_oom_recover(memcg); 2039 - } 2040 2033 cleanup: 2041 2034 current->memcg_in_oom = NULL; 2042 2035 css_put(&memcg->css);