mm, compaction: always finish scanning of a full pageblock
authorMel Gorman <mgorman@techsingularity.net>
Tue, 5 Mar 2019 23:44:46 +0000 (15:44 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 6 Mar 2019 05:07:16 +0000 (21:07 -0800)
When compaction is finishing, it uses a flag to ensure the pageblock is
complete but it makes sense to always complete migration of a pageblock.
Minimally, skip information is based on a pageblock and partially
scanned pageblocks may incur more scanning in the future.  The pageblock
skip handling also becomes more strict later in the series and the hint
is more useful if a complete pageblock was always scanned.

The potentially impacts latency as more scanning is done but it's not a
consistent win or loss as the scanning is not always a high percentage
of the pageblock and sometimes it is offset by future reductions in
scanning.  Hence, the results are not presented this time due to a
misleading mix of gains/losses without any clear pattern.  However, full
scanning of the pageblock is important for later patches.

Link: http://lkml.kernel.org/r/20190118175136.31341-8-mgorman@techsingularity.net
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
Cc: David Rientjes <rientjes@google.com>
Cc: YueHaibing <yuehaibing@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/compaction.c
mm/internal.h

index 32a88b49f9735d09fcab47868f687149ed7d5ed2..3d11c209614a21175fdf507aee29c931b4e89ac3 100644 (file)
@@ -1331,16 +1331,14 @@ static enum compact_result __compact_finished(struct compact_control *cc)
        if (is_via_compact_memory(cc->order))
                return COMPACT_CONTINUE;
 
-       if (cc->finishing_block) {
-               /*
-                * We have finished the pageblock, but better check again that
-                * we really succeeded.
-                */
-               if (IS_ALIGNED(cc->migrate_pfn, pageblock_nr_pages))
-                       cc->finishing_block = false;
-               else
-                       return COMPACT_CONTINUE;
-       }
+       /*
+        * Always finish scanning a pageblock to reduce the possibility of
+        * fallbacks in the future. This is particularly important when
+        * migration source is unmovable/reclaimable but it's not worth
+        * special casing.
+        */
+       if (!IS_ALIGNED(cc->migrate_pfn, pageblock_nr_pages))
+               return COMPACT_CONTINUE;
 
        /* Direct compactor: Is a suitable page free? */
        for (order = cc->order; order < MAX_ORDER; order++) {
@@ -1382,7 +1380,6 @@ static enum compact_result __compact_finished(struct compact_control *cc)
                                return COMPACT_SUCCESS;
                        }
 
-                       cc->finishing_block = true;
                        return COMPACT_CONTINUE;
                }
        }
index f40d06d70683607b9cc53e6bb1cedd8242ad894c..9b32f4cab0ae8e01572e941102e99cc5cb9b6e60 100644 (file)
@@ -203,7 +203,6 @@ struct compact_control {
        bool direct_compaction;         /* False from kcompactd or /proc/... */
        bool whole_zone;                /* Whole zone should/has been scanned */
        bool contended;                 /* Signal lock or sched contention */
-       bool finishing_block;           /* Finishing current pageblock */
 };
 
 unsigned long