• D
    oom: sacrifice child with highest badness score for parent · 5e9d834a
    David Rientjes 提交于
    When a task is chosen for oom kill, the oom killer first attempts to
    sacrifice a child not sharing its parent's memory instead.  Unfortunately,
    this often kills in a seemingly random fashion based on the ordering of
    the selected task's child list.  Additionally, it is not guaranteed at all
    to free a large amount of memory that we need to prevent additional oom
    killing in the very near future.
    
    Instead, we now only attempt to sacrifice the worst child not sharing its
    parent's memory, if one exists.  The worst child is indicated with the
    highest badness() score.  This serves two advantages: we kill a
    memory-hogging task more often, and we allow the configurable
    /proc/pid/oom_adj value to be considered as a factor in which child to
    kill.
    
    Reviewers may observe that the previous implementation would iterate
    through the children and attempt to kill each until one was successful and
    then the parent if none were found while the new code simply kills the
    most memory-hogging task or the parent.  Note that the only time
    oom_kill_task() fails, however, is when a child does not have an mm or has
    a /proc/pid/oom_adj of OOM_DISABLE.  badness() returns 0 for both cases,
    so the final oom_kill_task() will always succeed.
    Signed-off-by: NDavid Rientjes <rientjes@google.com>
    Acked-by: NRik van Riel <riel@redhat.com>
    Acked-by: NNick Piggin <npiggin@suse.de>
    Acked-by: NBalbir Singh <balbir@linux.vnet.ibm.com>
    Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Reviewed-by: NKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    5e9d834a
oom_kill.c 18.5 KB