diff options
author | Mel Gorman <mgorman@techsingularity.net> | 2016-07-28 18:47:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-07-28 19:07:41 -0400 |
commit | 5a1c84b404a7176b8b36e2a0041b6f0adb3151a3 (patch) | |
tree | ff98e242c5d4d3a24ca49f6ddc707028aeb938f9 /mm/compaction.c | |
parent | bb4cc2bea6df7854d629bff114ca03237cc718d6 (diff) |
mm: remove reclaim and compaction retry approximations
If per-zone LRU accounting is available then there is no point
approximating whether reclaim and compaction should retry based on pgdat
statistics. This is effectively a revert of "mm, vmstat: remove zone
and node double accounting by approximating retries" with the difference
that inactive/active stats are still available. This preserves the
history of why the approximation was retried and why it had to be
reverted to handle OOM kills on 32-bit systems.
Link: http://lkml.kernel.org/r/1469110261-7365-4-git-send-email-mgorman@techsingularity.net
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Minchan Kim <minchan@kernel.org>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/compaction.c')
-rw-r--r-- | mm/compaction.c | 20 |
1 files changed, 1 insertions, 19 deletions
diff --git a/mm/compaction.c b/mm/compaction.c index cd93ea24c565..e5995f38d677 100644 --- a/mm/compaction.c +++ b/mm/compaction.c | |||
@@ -1438,11 +1438,6 @@ 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; | ||
1446 | 1441 | ||
1447 | /* | 1442 | /* |
1448 | * Make sure at least one zone would pass __compaction_suitable if we continue | 1443 | * Make sure at least one zone would pass __compaction_suitable if we continue |
@@ -1453,27 +1448,14 @@ bool compaction_zonelist_suitable(struct alloc_context *ac, int order, | |||
1453 | unsigned long available; | 1448 | unsigned long available; |
1454 | enum compact_result compact_result; | 1449 | enum compact_result compact_result; |
1455 | 1450 | ||
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 | |||
1469 | /* | 1451 | /* |
1470 | * Do not consider all the reclaimable memory because we do not | 1452 | * Do not consider all the reclaimable memory because we do not |
1471 | * want to trash just for a single high order allocation which | 1453 | * want to trash just for a single high order allocation which |
1472 | * is even not guaranteed to appear even if __compaction_suitable | 1454 | * is even not guaranteed to appear even if __compaction_suitable |
1473 | * is happy about the watermark check. | 1455 | * is happy about the watermark check. |
1474 | */ | 1456 | */ |
1457 | available = zone_reclaimable_pages(zone) / order; | ||
1475 | available += zone_page_state_snapshot(zone, NR_FREE_PAGES); | 1458 | available += zone_page_state_snapshot(zone, NR_FREE_PAGES); |
1476 | available = min(zone->managed_pages, available); | ||
1477 | compact_result = __compaction_suitable(zone, order, alloc_flags, | 1459 | compact_result = __compaction_suitable(zone, order, alloc_flags, |
1478 | ac_classzone_idx(ac), available); | 1460 | ac_classzone_idx(ac), available); |
1479 | if (compact_result != COMPACT_SKIPPED && | 1461 | if (compact_result != COMPACT_SKIPPED && |