• Michal Hocko's avatar
    mm, oom_reaper: make sure that mmput_async is called only when memory was reaped · e5e3f4c4
    Michal Hocko authored
    Tetsuo is worried that mmput_async might still lead to a premature new
    oom victim selection due to the following race:
    
    __oom_reap_task				exit_mm
      find_lock_task_mm
      atomic_inc(mm->mm_users) # = 2
      task_unlock
      					  task_lock
    					  task->mm = NULL
    					  up_read(&mm->mmap_sem)
    		< somebody write locks mmap_sem >
    					  task_unlock
    					  mmput
      					    atomic_dec_and_test # = 1
    					  exit_oom_victim
      down_read_trylock # failed - no reclaim
      mmput_async # Takes unpredictable amount of time
      		< new OOM situation >
    
    the final __mmput will be executed in the delayed context which might
    happen far in the future.  Such a race is highly unlikely because the
    write holder of mmap_sem would have to be an external task (all direct
    holders are already killed or exiting) and it usually have to pin
    mm_users in order to do anything reasonable.
    
    We can, however, make sure that the mmput_async is only called when we
    do not back off and reap some memory.  That would reduce the impact of
    the delayed __mmput because the real content would be already freed.
    Pin mm_count to keep it alive after we drop task_lock and before we try
    to get mmap_sem.  If the mmap_sem succeeds we can try to grab mm_users
    reference and then go on with unmapping the address space.
    
    It is not clear whether this race is possible at all but it is better to
    be more robust and do not pin mm_users unless we are sure we are
    actually doing some real work during __oom_reap_task.
    
    Link: http://lkml.kernel.org/r/1465306987-30297-1-git-send-email-mhocko@kernel.orgSigned-off-by: default avatarMichal Hocko <mhocko@suse.com>
    Reported-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e5e3f4c4
oom_kill.c 27.2 KB