• Michal Hocko's avatar
    mm, oom: protect !costly allocations some more · 33c2d214
    Michal Hocko authored
    should_reclaim_retry will give up retries for higher order allocations
    if none of the eligible zones has any requested or higher order pages
    available even if we pass the watermak check for order-0.  This is done
    because there is no guarantee that the reclaimable and currently free
    pages will form the required order.
    
    This can, however, lead to situations where the high-order request (e.g.
    order-2 required for the stack allocation during fork) will trigger OOM
    too early - e.g.  after the first reclaim/compaction round.  Such a
    system would have to be highly fragmented and there is no guarantee
    further reclaim/compaction attempts would help but at least make sure
    that the compaction was active before we go OOM and keep retrying even
    if should_reclaim_retry tells us to oom if
    
    	- the last compaction round backed off or
    	- we haven't completed at least MAX_COMPACT_RETRIES active
    	  compaction rounds.
    
    The first rule ensures that the very last attempt for compaction was not
    ignored while the second guarantees that the compaction has done some
    work.  Multiple retries might be needed to prevent occasional pigggy
    backing of other contexts to steal the compacted pages before the
    current context manages to retry to allocate them.
    
    compaction_failed() is taken as a final word from the compaction that
    the retry doesn't make much sense.  We have to be careful though because
    the first compaction round is MIGRATE_ASYNC which is rather weak as it
    ignores pages under writeback and gives up too easily in other
    situations.  We therefore have to make sure that MIGRATE_SYNC_LIGHT mode
    has been used before we give up.  With this logic in place we do not
    have to increase the migration mode unconditionally and rather do it
    only if the compaction failed for the weaker mode.  A nice side effect
    is that the stronger migration mode is used only when really needed so
    this has a potential of smaller latencies in some cases.
    
    Please note that the compaction doesn't tell us much about how
    successful it was when returning compaction_made_progress so we just
    have to blindly trust that another retry is worthwhile and cap the
    number to something reasonable to guarantee a convergence.
    
    If the given number of successful retries is not sufficient for a
    reasonable workloads we should focus on the collected compaction
    tracepoints data and try to address the issue in the compaction code.
    If this is not feasible we can increase the retries limit.
    
    [mhocko@suse.com: fix warning]
      Link: http://lkml.kernel.org/r/20160512061636.GA4200@dhcp22.suse.czSigned-off-by: default avatarMichal Hocko <mhocko@suse.com>
    Acked-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Acked-by: default avatarHillf Danton <hillf.zj@alibaba-inc.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Joonsoo Kim <js1304@gmail.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Cc: Vladimir Davydov <vdavydov@virtuozzo.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    33c2d214
page_alloc.c 206 KB