• David Rientjes's avatar
    oom: sacrifice child with highest badness score for parent · 5e9d834a
    David Rientjes authored
    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: default avatarDavid Rientjes <rientjes@google.com>
    Acked-by: default avatarRik van Riel <riel@redhat.com>
    Acked-by: default avatarNick Piggin <npiggin@suse.de>
    Acked-by: default avatarBalbir Singh <balbir@linux.vnet.ibm.com>
    Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Reviewed-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    5e9d834a
oom_kill.c 18.5 KB