• Mel Gorman's avatar
    mm: avoid livelock on !__GFP_FS allocations · f90ac398
    Mel Gorman authored
    Colin Cross reported;
    
      Under the following conditions, __alloc_pages_slowpath can loop forever:
      gfp_mask & __GFP_WAIT is true
      gfp_mask & __GFP_FS is false
      reclaim and compaction make no progress
      order <= PAGE_ALLOC_COSTLY_ORDER
    
      These conditions happen very often during suspend and resume,
      when pm_restrict_gfp_mask() effectively converts all GFP_KERNEL
      allocations into __GFP_WAIT.
    
      The oom killer is not run because gfp_mask & __GFP_FS is false,
      but should_alloc_retry will always return true when order is less
      than PAGE_ALLOC_COSTLY_ORDER.
    
    In his fix, he avoided retrying the allocation if reclaim made no progress
    and __GFP_FS was not set.  The problem is that this would result in
    GFP_NOIO allocations failing that previously succeeded which would be very
    unfortunate.
    
    The big difference between GFP_NOIO and suspend converting GFP_KERNEL to
    behave like GFP_NOIO is that normally flushers will be cleaning pages and
    kswapd reclaims pages allowing GFP_NOIO to succeed after a short delay.
    The same does not necessarily apply during suspend as the storage device
    may be suspended.
    
    This patch special cases the suspend case to fail the page allocation if
    reclaim cannot make progress and adds some documentation on how
    gfp_allowed_mask is currently used.  Failing allocations like this may
    cause suspend to abort but that is better than a livelock.
    
    [mgorman@suse.de: Rework fix to be suspend specific]
    [rientjes@google.com: Move suspended device check to should_alloc_retry]
    Reported-by: default avatarColin Cross <ccross@android.com>
    Signed-off-by: default avatarMel Gorman <mgorman@suse.de>
    Acked-by: default avatarDavid Rientjes <rientjes@google.com>
    Cc: Minchan Kim <minchan.kim@gmail.com>
    Cc: Pekka Enberg <penberg@cs.helsinki.fi>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f90ac398
swapfile.c 65.3 KB