On 5/15/23 13:33, Mel Gorman wrote: > compact_zone() intends to rescan pageblocks if there is a failure to > migrate "within the current order-aligned block". However, the pageblock > scan may already be complete and moved to the next block causing the > next pageblock to be "rescanned". Ensure only the most recent pageblock > is rescanned. > > Reported-by: Vlastimil Babka <vbabka@xxxxxxx> > Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > mm/compaction.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/mm/compaction.c b/mm/compaction.c > index c8bcdea15f5f..81791c124bb8 100644 > --- a/mm/compaction.c > +++ b/mm/compaction.c > @@ -2464,8 +2464,9 @@ compact_zone(struct compact_control *cc, struct capture_control *capc) > * fast_find_migrateblock revisiting blocks that were > * recently partially scanned. > */ > - if (cc->direct_compaction && !cc->finish_pageblock && > - (cc->mode < MIGRATE_SYNC)) { > + if (!pageblock_aligned(cc->migrate_pfn) && > + cc->direct_compaction && !cc->finish_pageblock && > + (cc->mode < MIGRATE_SYNC)) { > cc->finish_pageblock = true; > > /*