Skip to content
Permalink
Browse files
mm/page_alloc: try oom if reclaim is unable to make forward progress
In the situation where direct reclaim is required to make progress for
compaction but no_progress_loops is already over the limit of
MAX_RECLAIM_RETRIES consider invoking the oom killer.

Signed-off-by: Aaron Tomlin <atomlin@redhat.com>
  • Loading branch information
Aaron Tomlin authored and intel-lab-lkp committed Mar 15, 2021
1 parent 2932a9e commit 77338aaff2606a7715c832545e79370e849e3b4e
Showing 1 changed file with 18 additions and 4 deletions.
@@ -4071,6 +4071,16 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,
return NULL;
}

static inline bool
should_try_oom(int no_progress_loops,
enum compact_result last_compact_result)
{
if (no_progress_loops > MAX_RECLAIM_RETRIES && last_compact_result
== COMPACT_SKIPPED)
return true;
return false;
}

static inline bool
should_compact_retry(struct alloc_context *ac, int order, int alloc_flags,
enum compact_result compact_result,
@@ -4430,10 +4440,11 @@ should_reclaim_retry(gfp_t gfp_mask, unsigned order,
* Make sure we converge to OOM if we cannot make any progress
* several times in the row.
*/
if (*no_progress_loops > MAX_RECLAIM_RETRIES) {
/* Before OOM, exhaust highatomic_reserve */
return unreserve_highatomic_pageblock(ac, true);
}
if (*no_progress_loops > MAX_RECLAIM_RETRIES)
result false;
/* Last chance before OOM, try draining highatomic_reserve once */
else if (*no_progress_loops == MAX_RECLAIM_RETRIES)
return unreserve_highatomic_pageblock(ac, true)

/*
* Keep reclaiming pages while there is a chance this will lead
@@ -4705,6 +4716,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
did_some_progress > 0, &no_progress_loops))
goto retry;

if (should_try_oom(no_progress_loops, compact_result))
goto oom:
/*
* It doesn't make any sense to retry for the compaction if the order-0
* reclaim is not able to make any progress because the current
@@ -4722,6 +4735,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
if (check_retry_cpuset(cpuset_mems_cookie, ac))
goto retry_cpuset;

oom:
/* Reclaim has failed us, start killing things */
page = __alloc_pages_may_oom(gfp_mask, order, ac, &did_some_progress);
if (page)

0 comments on commit 77338aa

Please sign in to comment.