mm/vmscan: do not check compaction_ready on promoted zones
We abort direct reclaim if we find the zone is ready for compaction. Sometimes the zone is just a promoted highmem zone to force a scan of highmem, which is not the intended zone the caller want to allocate a page from. In this situation, setting aborted_reclaim to indicate the caller turned back to retry the allocation is waste of time and could cause a loop in __alloc_pages_slowpath(). This patch does not check compaction_ready() on promoted zones to avoid the above situation. Only set aborted_reclaim if the caller intended zone is ready for compaction. Signed-off-by: Weijie Yang <weijie.yang@samsung.com> Acked-by: Rik van Riel <riel@redhat.com> Acked-by: Mel Gorman <mgorman@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
619d0d76c1
commit
9bbc04eeb0
|
@ -2318,6 +2318,7 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
|
|||
struct shrink_control shrink = {
|
||||
.gfp_mask = sc->gfp_mask,
|
||||
};
|
||||
enum zone_type requested_highidx = gfp_zone(sc->gfp_mask);
|
||||
|
||||
/*
|
||||
* If the number of buffer_heads in the machine exceeds the maximum
|
||||
|
@ -2358,7 +2359,8 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
|
|||
* noticeable problem, like transparent huge
|
||||
* page allocations.
|
||||
*/
|
||||
if (compaction_ready(zone, sc)) {
|
||||
if ((zonelist_zone_idx(z) <= requested_highidx)
|
||||
&& compaction_ready(zone, sc)) {
|
||||
aborted_reclaim = true;
|
||||
continue;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue