Testing shows fast_isolate_freepages can blindly choose an unsuitable pageblock from time to time particularly while the min mark is used from XXX path: if (!page) { cc->fast_search_fail++; if (scan_start) { /* * Use the highest PFN found above min. If one was * not found, be pessimistic for direct compaction * and use the min mark. */ if (highest >= min_pfn) { page = pfn_to_page(highest); cc->free_pfn = highest; } else { if (cc->direct_compaction && pfn_valid(min_pfn)) { /* XXX */ page = pageblock_pfn_to_page(min_pfn, min(pageblock_end_pfn(min_pfn), zone_end_pfn(cc->zone)), cc->zone); cc->free_pfn = min_pfn; } } } } In contrast, slow path is skipping unsuitable pageblocks in a decent way. I don't know if it is an intended design or just an oversight. But it seems more sensible to skip unsuitable pageblock. Reported-by: Zhanyuan Hu <huzhanyuan@xxxxxxxx> Signed-off-by: Barry Song <v-songbaohua@xxxxxxxx> --- mm/compaction.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mm/compaction.c b/mm/compaction.c index 01ba298739dd..98c485a25614 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -1625,6 +1625,12 @@ static void fast_isolate_freepages(struct compact_control *cc) cc->total_free_scanned += nr_scanned; if (!page) return; + /* + * Otherwise, we can blindly choose an improper pageblock especially + * while using the min mark + */ + if (!suitable_migration_target(cc, page)) + return; low_pfn = page_to_pfn(page); fast_isolate_around(cc, low_pfn); -- 2.34.1