• M
    mm/page_alloc.c: do not loop over ALLOC_NO_WATERMARKS without triggering reclaim · 33d53103
    Michal Hocko 提交于
    __alloc_pages_slowpath is looping over ALLOC_NO_WATERMARKS requests if
    __GFP_NOFAIL is requested.  This is fragile because we are basically
    relying on somebody else to make the reclaim (be it the direct reclaim
    or OOM killer) for us.  The caller might be holding resources (e.g.
    locks) which block other other reclaimers from making any progress for
    example.  Remove the retry loop and rely on __alloc_pages_slowpath to
    invoke all allowed reclaim steps and retry logic.
    
    We have to be careful about __GFP_NOFAIL allocations from the
    PF_MEMALLOC context even though this is a very bad idea to begin with
    because no progress can be gurateed at all.  We shouldn't break the
    __GFP_NOFAIL semantic here though.  It could be argued that this is
    essentially GFP_NOWAIT context which we do not support but PF_MEMALLOC
    is much harder to check for existing users because they might happen
    deep down the code path performed much later after setting the flag so
    we cannot really rule out there is no kernel path triggering this
    combination.
    Signed-off-by: NMichal Hocko <mhocko@suse.com>
    Acked-by: NMel Gorman <mgorman@suse.de>
    Acked-by: NDavid Rientjes <rientjes@google.com>
    Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Acked-by: NVlastimil Babka <vbabka@suse.cz>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    33d53103
page_alloc.c 189.2 KB