mm, page_alloc: pull no_progress_loops update to should_reclaim_retry()
The should_reclaim_retry() makes decisions based on no_progress_loops, so it makes sense to also update the counter there. It will be also consistent with should_compact_retry() and compaction_retries. No functional change. [hillf.zj@alibaba-inc.com: fix missing pointer dereferences] Link: http://lkml.kernel.org/r/20160926162025.21555-3-vbabka@suse.cz Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Acked-by: Hillf Danton <hillf.zj@alibaba-inc.com> Acked-by: Michal Hocko <mhocko@suse.com> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: David Rientjes <rientjes@google.com> Cc: Rik van Riel <riel@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
9f7e338793
commit
423b452e15
|
@ -3402,16 +3402,26 @@ bool gfp_pfmemalloc_allowed(gfp_t gfp_mask)
|
||||||
static inline bool
|
static inline bool
|
||||||
should_reclaim_retry(gfp_t gfp_mask, unsigned order,
|
should_reclaim_retry(gfp_t gfp_mask, unsigned order,
|
||||||
struct alloc_context *ac, int alloc_flags,
|
struct alloc_context *ac, int alloc_flags,
|
||||||
bool did_some_progress, int no_progress_loops)
|
bool did_some_progress, int *no_progress_loops)
|
||||||
{
|
{
|
||||||
struct zone *zone;
|
struct zone *zone;
|
||||||
struct zoneref *z;
|
struct zoneref *z;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Costly allocations might have made a progress but this doesn't mean
|
||||||
|
* their order will become available due to high fragmentation so
|
||||||
|
* always increment the no progress counter for them
|
||||||
|
*/
|
||||||
|
if (did_some_progress && order <= PAGE_ALLOC_COSTLY_ORDER)
|
||||||
|
*no_progress_loops = 0;
|
||||||
|
else
|
||||||
|
(*no_progress_loops)++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure we converge to OOM if we cannot make any progress
|
* Make sure we converge to OOM if we cannot make any progress
|
||||||
* several times in the row.
|
* several times in the row.
|
||||||
*/
|
*/
|
||||||
if (no_progress_loops > MAX_RECLAIM_RETRIES)
|
if (*no_progress_loops > MAX_RECLAIM_RETRIES)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3426,7 +3436,7 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order,
|
||||||
unsigned long reclaimable;
|
unsigned long reclaimable;
|
||||||
|
|
||||||
available = reclaimable = zone_reclaimable_pages(zone);
|
available = reclaimable = zone_reclaimable_pages(zone);
|
||||||
available -= DIV_ROUND_UP(no_progress_loops * available,
|
available -= DIV_ROUND_UP((*no_progress_loops) * available,
|
||||||
MAX_RECLAIM_RETRIES);
|
MAX_RECLAIM_RETRIES);
|
||||||
available += zone_page_state_snapshot(zone, NR_FREE_PAGES);
|
available += zone_page_state_snapshot(zone, NR_FREE_PAGES);
|
||||||
|
|
||||||
|
@ -3642,18 +3652,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
|
||||||
if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_REPEAT))
|
if (order > PAGE_ALLOC_COSTLY_ORDER && !(gfp_mask & __GFP_REPEAT))
|
||||||
goto nopage;
|
goto nopage;
|
||||||
|
|
||||||
/*
|
|
||||||
* Costly allocations might have made a progress but this doesn't mean
|
|
||||||
* their order will become available due to high fragmentation so
|
|
||||||
* always increment the no progress counter for them
|
|
||||||
*/
|
|
||||||
if (did_some_progress && order <= PAGE_ALLOC_COSTLY_ORDER)
|
|
||||||
no_progress_loops = 0;
|
|
||||||
else
|
|
||||||
no_progress_loops++;
|
|
||||||
|
|
||||||
if (should_reclaim_retry(gfp_mask, order, ac, alloc_flags,
|
if (should_reclaim_retry(gfp_mask, order, ac, alloc_flags,
|
||||||
did_some_progress > 0, no_progress_loops))
|
did_some_progress > 0, &no_progress_loops))
|
||||||
goto retry;
|
goto retry;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue