Skip to content
  • Michal Hocko's avatar
    oom: make oom_reaper freezable · e2679606
    Michal Hocko authored
    
    
    After "oom: clear TIF_MEMDIE after oom_reaper managed to unmap the
    address space" oom_reaper will call exit_oom_victim on the target task
    after it is done.  This might however race with the PM freezer:
    
    CPU0				CPU1				CPU2
    freeze_processes
      try_to_freeze_tasks
      				# Allocation request
    				out_of_memory
      oom_killer_disable
    				  wake_oom_reaper(P1)
    				  				__oom_reap_task
    								  exit_oom_victim(P1)
        wait_event(oom_victims==0)
    [...]
        				do_exit(P1)
    				  perform IO/interfere with the freezer
    
    which breaks the oom_killer_disable semantic.  We no longer have a
    guarantee that the oom victim won't interfere with the freezer because
    it might be anywhere on the way to do_exit while the freezer thinks the
    task has already terminated.  It might trigger IO or touch devices which
    are frozen already.
    
    In order to close this race, make the oom_reaper thread freezable.  This
    will work because
    	a) already running oom_reaper will block freezer to enter the
    	   quiescent state
    	b) wake_oom_reaper will not wake up the reaper after it has been
    	   frozen
    	c) the only way to call exit_oom_victim after try_to_freeze_tasks
    	   is from the oom victim's context when we know the further
    	   interference shouldn't be possible
    
    Signed-off-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Rik van Riel <riel@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e2679606