• NeilBrown's avatar
    mm: introduce memalloc_retry_wait() · 4034247a
    NeilBrown authored
    Various places in the kernel - largely in filesystems - respond to a
    memory allocation failure by looping around and re-trying.  Some of
    these cannot conveniently use __GFP_NOFAIL, for reasons such as:
    
     - a GFP_ATOMIC allocation, which __GFP_NOFAIL doesn't work on
     - a need to check for the process being signalled between failures
     - the possibility that other recovery actions could be performed
     - the allocation is quite deep in support code, and passing down an
       extra flag to say if __GFP_NOFAIL is wanted would be clumsy.
    
    Many of these currently use congestion_wait() which (in almost all
    cases) simply waits the given timeout - congestion isn't tracked for
    most devices.
    
    It isn't clear what the best delay is for loops, but it is clear that
    the various filesystems shouldn't be responsible for choosing a timeout.
    
    This patch introduces memalloc_retry_wait() with takes on that
    responsibility.  Code that wants to retry a memory allocation can call
    this function passing the GFP flags that were used.  It will wait
    however is appropriate.
    
    For now, it only considers __GFP_NORETRY and whatever
    gfpflags_allow_blocking() tests.  If blocking is allowed without
    __GFP_NORETRY, then alloc_page either made some reclaim progress, or
    waited for a while, before failing.  So there is no need for much
    further waiting.  memalloc_retry_wait() will wait until the current
    jiffie ends.  If this condition is not met, then alloc_page() won't have
    waited much if at all.  In that case memalloc_retry_wait() waits about
    200ms.  This is the delay that most current loops uses.
    
    linux/sched/mm.h needs to be included in some files now,
    but linux/backing-dev.h does not.
    
    Link: https://lkml.kernel.org/r/163754371968.13692.1277530886009912421@noble.neil.brown.nameSigned-off-by: default avatarNeilBrown <neilb@suse.de>
    Cc: Dave Chinner <david@fromorbit.com>
    Cc: Michal Hocko <mhocko@suse.com>
    Cc: "Theodore Ts'o" <tytso@mit.edu>
    Cc: Jaegeuk Kim <jaegeuk@kernel.org>
    Cc: Chao Yu <chao@kernel.org>
    Cc: Darrick J. Wong <djwong@kernel.org>
    Cc: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    4034247a
kmem.c 681 Bytes