• Rafael J. Wysocki's avatar
    mm, PM/Freezer: Disable OOM killer when tasks are frozen · 7f33d49a
    Rafael J. Wysocki authored
    Currently, the following scenario appears to be possible in theory:
    
    * Tasks are frozen for hibernation or suspend.
    * Free pages are almost exhausted.
    * Certain piece of code in the suspend code path attempts to allocate
      some memory using GFP_KERNEL and allocation order less than or
      equal to PAGE_ALLOC_COSTLY_ORDER.
    * __alloc_pages_internal() cannot find a free page so it invokes the
      OOM killer.
    * The OOM killer attempts to kill a task, but the task is frozen, so
      it doesn't die immediately.
    * __alloc_pages_internal() jumps to 'restart', unsuccessfully tries
      to find a free page and invokes the OOM killer.
    * No progress can be made.
    
    Although it is now hard to trigger during hibernation due to the memory
    shrinking carried out by the hibernation code, it is theoretically
    possible to trigger during suspend after the memory shrinking has been
    removed from that code path.  Moreover, since memory allocations are
    going to be used for the hibernation memory shrinking, it will be even
    more likely to happen during hibernation.
    
    To prevent it from happening, introduce the oom_killer_disabled switch
    that will cause __alloc_pages_internal() to fail in the situations in
    which the OOM killer would have been called and make the freezer set
    this switch after tasks have been successfully frozen.
    
    [akpm@linux-foundation.org: be nicer to the namespace]
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Cc: Fengguang Wu <fengguang.wu@gmail.com>
    Cc: David Rientjes <rientjes@google.com>
    Acked-by: default avatarPavel Machek <pavel@ucw.cz>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7f33d49a
process.c 3.33 KB