[Devel] [PATCH RHEL7 COMMIT] ms/mm: compaction: reset scanner positions immediately when they meet

Konstantin Khorenko khorenko at virtuozzo.com
Wed Jan 31 18:21:52 MSK 2018


The commit is pushed to "branch-rh7-3.10.0-693.11.6.vz7.42.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.11.6.vz7.42.4
------>
commit e1d5051dedf035162e4ced97b5fab2e2ff604682
Author: Vlastimil Babka <vbabka at suse.cz>
Date:   Wed Jan 31 18:21:52 2018 +0300

    ms/mm: compaction: reset scanner positions immediately when they meet
    
    Compaction used to start its migrate and free page scaners at the zone's
    lowest and highest pfn, respectively.  Later, caching was introduced to
    remember the scanners' progress across compaction attempts so that
    pageblocks are not re-scanned uselessly.  Additionally, pageblocks where
    isolation failed are marked to be quickly skipped when encountered again
    in future compactions.
    
    Currently, both the reset of cached pfn's and clearing of the pageblock
    skip information for a zone is done in __reset_isolation_suitable().
    This function gets called when:
    
     - compaction is restarting after being deferred
     - compact_blockskip_flush flag is set in compact_finished() when the scanners
       meet (and not again cleared when direct compaction succeeds in allocation)
       and kswapd acts upon this flag before going to sleep
    
    This behavior is suboptimal for several reasons:
    
     - when direct sync compaction is called after async compaction fails (in the
       allocation slowpath), it will effectively do nothing, unless kswapd
       happens to process the compact_blockskip_flush flag meanwhile. This is racy
       and goes against the purpose of sync compaction to more thoroughly retry
       the compaction of a zone where async compaction has failed.
       The restart-after-deferring path cannot help here as deferring happens only
       after the sync compaction fails. It is also done only for the preferred
       zone, while the compaction might be done for a fallback zone.
    
     - the mechanism of marking pageblock to be skipped has little value since the
       cached pfn's are reset only together with the pageblock skip flags. This
       effectively limits pageblock skip usage to parallel compactions.
    
    This patch changes compact_finished() so that cached pfn's are reset
    immediately when the scanners meet.  Clearing pageblock skip flags is
    unchanged, as well as the other situations where cached pfn's are reset.
    This allows the sync-after-async compaction to retry pageblocks not
    marked as skipped, such as blocks !MIGRATE_MOVABLE blocks that async
    compactions now skips without marking them.
    
    Signed-off-by: Vlastimil Babka <vbabka at suse.cz>
    Cc: Rik van Riel <riel at redhat.com>
    Acked-by: Mel Gorman <mgorman at suse.de>
    Cc: Joonsoo Kim <iamjoonsoo.kim at lge.com>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
    (cherry picked from commit 55b7c4c99f6a448f72179297fe6432544f220063)
    Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
---
 mm/compaction.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/mm/compaction.c b/mm/compaction.c
index 8ebf3d10ef17..bbb1f65b0041 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -866,6 +866,10 @@ static int compact_finished(struct zone *zone,
 
 	/* Compaction run completes if the migrate and free scanner meet */
 	if (cc->free_pfn <= cc->migrate_pfn) {
+		/* Let the next compaction start anew. */
+		zone->compact_cached_migrate_pfn = zone->zone_start_pfn;
+		zone->compact_cached_free_pfn = zone_end_pfn(zone);
+
 		/*
 		 * Mark that the PG_migrate_skip information should be cleared
 		 * by kswapd when it goes to sleep. kswapd does not set the


More information about the Devel mailing list