aboutsummaryrefslogtreecommitdiffstats
path: root/mm/compaction.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/compaction.c')
-rw-r--r--mm/compaction.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/mm/compaction.c b/mm/compaction.c
index e5995f38d677..cd93ea24c565 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1438,6 +1438,11 @@ bool compaction_zonelist_suitable(struct alloc_context *ac, int order,
1438{ 1438{
1439 struct zone *zone; 1439 struct zone *zone;
1440 struct zoneref *z; 1440 struct zoneref *z;
1441 pg_data_t *last_pgdat = NULL;
1442
1443 /* Do not retry compaction for zone-constrained allocations */
1444 if (ac->high_zoneidx < ZONE_NORMAL)
1445 return false;
1441 1446
1442 /* 1447 /*
1443 * Make sure at least one zone would pass __compaction_suitable if we continue 1448 * Make sure at least one zone would pass __compaction_suitable if we continue
@@ -1448,14 +1453,27 @@ bool compaction_zonelist_suitable(struct alloc_context *ac, int order,
1448 unsigned long available; 1453 unsigned long available;
1449 enum compact_result compact_result; 1454 enum compact_result compact_result;
1450 1455
1456 if (last_pgdat == zone->zone_pgdat)
1457 continue;
1458
1459 /*
1460 * This over-estimates the number of pages available for
1461 * reclaim/compaction but walking the LRU would take too
1462 * long. The consequences are that compaction may retry
1463 * longer than it should for a zone-constrained allocation
1464 * request.
1465 */
1466 last_pgdat = zone->zone_pgdat;
1467 available = pgdat_reclaimable_pages(zone->zone_pgdat) / order;
1468
1451 /* 1469 /*
1452 * Do not consider all the reclaimable memory because we do not 1470 * Do not consider all the reclaimable memory because we do not
1453 * want to trash just for a single high order allocation which 1471 * want to trash just for a single high order allocation which
1454 * is even not guaranteed to appear even if __compaction_suitable 1472 * is even not guaranteed to appear even if __compaction_suitable
1455 * is happy about the watermark check. 1473 * is happy about the watermark check.
1456 */ 1474 */
1457 available = zone_reclaimable_pages(zone) / order;
1458 available += zone_page_state_snapshot(zone, NR_FREE_PAGES); 1475 available += zone_page_state_snapshot(zone, NR_FREE_PAGES);
1476 available = min(zone->managed_pages, available);
1459 compact_result = __compaction_suitable(zone, order, alloc_flags, 1477 compact_result = __compaction_suitable(zone, order, alloc_flags,
1460 ac_classzone_idx(ac), available); 1478 ac_classzone_idx(ac), available);
1461 if (compact_result != COMPACT_SKIPPED && 1479 if (compact_result != COMPACT_SKIPPED &&