• Michal Hocko's avatar
    oom: make sure that TIF_MEMDIE is set under task_lock · 83363b91
    Michal Hocko authored
    OOM killer tries to exclude tasks which do not have mm_struct associated
    because killing such a task wouldn't help much.  The OOM victim gets
    TIF_MEMDIE set to disable OOM killer while the current victim releases the
    memory and then enables the OOM killer again by dropping the flag.
    
    oom_kill_process is currently prone to a race condition when the OOM
    victim is already exiting and TIF_MEMDIE is set after the task releases
    its address space.  This might theoretically lead to OOM livelock if the
    OOM victim blocks on an allocation later during exiting because it
    wouldn't kill any other process and the exiting one won't be able to exit.
     The situation is highly unlikely because the OOM victim is expected to
    release some memory which should help to sort out OOM situation.
    
    Fix this by checking task->mm and setting TIF_MEMDIE flag under task_lock
    which will serialize the OOM killer with exit_mm which sets task->mm to
    NULL.  Setting the flag for current is not necessary because check and set
    is not racy.
    Reported-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Signed-off-by: default avatarMichal Hocko <mhocko@suse.cz>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    83363b91
oom_kill.c 20.1 KB