Commit a34753d2 authored by Vlastimil Babka's avatar Vlastimil Babka Committed by Linus Torvalds

mm, compaction: reduce spurious pcplist drains

Compaction drains the local pcplists each time migration scanner moves
away from a cc->order aligned block where it isolated pages for
migration, so that the pages freed by migrations can merge into higher
orders.

The detection is currently coarser than it could be.  The
cc->last_migrated_pfn variable should track the lowest pfn that was
isolated for migration.  But it is set to the pfn where
isolate_migratepages_block() starts scanning, which is typically the
first pfn of the pageblock.  There, the scanner might fail to isolate
several order-aligned blocks, and then isolate COMPACT_CLUSTER_MAX in
another block.  This would cause the pcplists drain to be performed,
although the scanner didn't yet finish the block where it isolated from.

This patch thus makes cc->last_migrated_pfn handling more accurate by
setting it to the pfn of an actually isolated page in
isolate_migratepages_block().  Although practical effects of this patch
are likely low, it arguably makes the intent of the code more obvious.
Also the next patch will make async direct compaction skip blocks more
aggressively, and draining pcplists due to skipped blocks is wasteful.
Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: Rik van Riel <riel@redhat.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Michal Hocko <mhocko@suse.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 06b6640a
...@@ -787,6 +787,15 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, ...@@ -787,6 +787,15 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
cc->nr_migratepages++; cc->nr_migratepages++;
nr_isolated++; nr_isolated++;
/*
* Record where we could have freed pages by migration and not
* yet flushed them to buddy allocator.
* - this is the lowest page that was isolated and likely be
* then freed by migration.
*/
if (!cc->last_migrated_pfn)
cc->last_migrated_pfn = low_pfn;
/* Avoid isolating too much */ /* Avoid isolating too much */
if (cc->nr_migratepages == COMPACT_CLUSTER_MAX) { if (cc->nr_migratepages == COMPACT_CLUSTER_MAX) {
++low_pfn; ++low_pfn;
...@@ -1075,7 +1084,6 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone, ...@@ -1075,7 +1084,6 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone,
unsigned long block_start_pfn; unsigned long block_start_pfn;
unsigned long block_end_pfn; unsigned long block_end_pfn;
unsigned long low_pfn; unsigned long low_pfn;
unsigned long isolate_start_pfn;
struct page *page; struct page *page;
const isolate_mode_t isolate_mode = const isolate_mode_t isolate_mode =
(sysctl_compact_unevictable_allowed ? ISOLATE_UNEVICTABLE : 0) | (sysctl_compact_unevictable_allowed ? ISOLATE_UNEVICTABLE : 0) |
...@@ -1130,7 +1138,6 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone, ...@@ -1130,7 +1138,6 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone,
continue; continue;
/* Perform the isolation */ /* Perform the isolation */
isolate_start_pfn = low_pfn;
low_pfn = isolate_migratepages_block(cc, low_pfn, low_pfn = isolate_migratepages_block(cc, low_pfn,
block_end_pfn, isolate_mode); block_end_pfn, isolate_mode);
...@@ -1139,15 +1146,6 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone, ...@@ -1139,15 +1146,6 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone,
return ISOLATE_ABORT; return ISOLATE_ABORT;
} }
/*
* Record where we could have freed pages by migration and not
* yet flushed them to buddy allocator.
* - this is the lowest page that could have been isolated and
* then freed by migration.
*/
if (cc->nr_migratepages && !cc->last_migrated_pfn)
cc->last_migrated_pfn = isolate_start_pfn;
/* /*
* Either we isolated something and proceed with migration. Or * Either we isolated something and proceed with migration. Or
* we failed and compact_zone should decide if we should * we failed and compact_zone should decide if we should
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment