Skip to content
  • Michal Hocko's avatar
    oom: keep mm of the killed task available · 26db62f1
    Michal Hocko authored
    oom_reap_task has to call exit_oom_victim in order to make sure that the
    oom vicim will not block the oom killer for ever.  This is, however,
    opening new problems (e.g oom_killer_disable exclusion - see commit
    74070542 ("oom, suspend: fix oom_reaper vs.  oom_killer_disable
    race")).  exit_oom_victim should be only called from the victim's
    context ideally.
    
    One way to achieve this would be to rely on per mm_struct flags.  We
    already have MMF_OOM_REAPED to hide a task from the oom killer since
    "mm, oom: hide mm which is shared with kthread or global init". The
    problem is that the exit path:
    
      do_exit
        exit_mm
          tsk->mm = NULL;
          mmput
            __mmput
          exit_oom_victim
    
    doesn't guarantee that exit_oom_victim will get called in a bounded
    amount of time.  At least exit_aio depends on IO which might get blocked
    due to lack of memory and who knows what else is lurking there.
    
    This patch takes a different approach.  We remember tsk->mm into the
    signal_struct and bind it to the signal struct life time for all oom
    victims.  __oom_reap_task_mm as well as oom_scan_process_thread do not
    have to rely on find_lock_task_mm anymore and they will have a reliable
    reference to the mm struct.  As a result all the oom specific
    communication inside the OOM killer can be done via tsk->signal->oom_mm.
    
    Increasing the signal_struct for something as unlikely as the oom killer
    is far from ideal but this approach will make the code much more
    reasonable and long term we even might want to move task->mm into the
    signal_struct anyway.  In the next step we might want to make the oom
    killer exclusion and access to memory reserves completely independent
    which would be also nice.
    
    Link: http://lkml.kernel.org/r/1472119394-11342-4-git-send-email-mhocko@kernel.org
    
    
    Signed-off-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Vladimir Davydov <vdavydov@parallels.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    26db62f1