• M
    mm, oom_reaper: implement OOM victims queuing · 03049269
    Michal Hocko 提交于
    wake_oom_reaper has allowed only 1 oom victim to be queued.  The main
    reason for that was the simplicity as other solutions would require some
    way of queuing.  The current approach is racy and that was deemed
    sufficient as the oom_reaper is considered a best effort approach to
    help with oom handling when the OOM victim cannot terminate in a
    reasonable time.  The race could lead to missing an oom victim which can
    get stuck
    
    out_of_memory
      wake_oom_reaper
        cmpxchg // OK
        			oom_reaper
    			  oom_reap_task
    			    __oom_reap_task
    oom_victim terminates
    			      atomic_inc_not_zero // fail
    out_of_memory
      wake_oom_reaper
        cmpxchg // fails
    			  task_to_reap = NULL
    
    This race requires 2 OOM invocations in a short time period which is not
    very likely but certainly not impossible.  E.g.  the original victim
    might have not released a lot of memory for some reason.
    
    The situation would improve considerably if wake_oom_reaper used a more
    robust queuing.  This is what this patch implements.  This means adding
    oom_reaper_list list_head into task_struct (eat a hole before embeded
    thread_struct for that purpose) and a oom_reaper_lock spinlock for
    queuing synchronization.  wake_oom_reaper will then add the task on the
    queue and oom_reaper will dequeue it.
    Signed-off-by: NMichal Hocko <mhocko@suse.com>
    Cc: Vladimir Davydov <vdavydov@virtuozzo.com>
    Cc: Andrea Argangeli <andrea@kernel.org>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Hugh Dickins <hughd@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    03049269
oom_kill.c 25.2 KB