• Haifeng Xu's avatar
    memcg, oom: remove explicit wakeup in mem_cgroup_oom_synchronize() · 18b1d18b
    Haifeng Xu authored
    Before commit 29ef680a ("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.comSigned-off-by: default avatarHaifeng Xu <haifeng.xu@shopee.com>
    Suggested-by: default avatarMichal Hocko <mhocko@suse.com>
    Acked-by: default avatarMichal 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: default avatarAndrew Morton <akpm@linux-foundation.org>
    18b1d18b
memcontrol.c 203 KB