Messages in this thread | | | Date | Tue, 1 Aug 2023 10:35:02 +0800 | Subject | Re: [PATCH 3/8] mm/compaction: skip page block marked skip in isolate_migratepages_block | From | Baolin Wang <> |
| |
On 7/29/2023 1:10 AM, Kemeng Shi wrote: > Move migrate_pfn to page block end when block is marked skip to avoid > unnecessary scan retry of that block from upper caller. > For example, compact_zone may wrongly rescan skip page block with > finish_pageblock set as following: > 1. cc->migrate point to the start of page block > 2. compact_zone record last_migrated_pfn to cc->migrate > 3. compact_zone->isolate_migratepages->isolate_migratepages_block tries to > scan the block. The low_pfn maybe moved forward to middle of block because > of free pages at beginning of block. > 4. we find first lru page could be isolated but block was exclusive marked > skip. > 5. abort isolate_migratepages_block and make cc->migrate_pfn point to > found lru page at middle of block. > 6. compact_zone find cc->migrate_pfn and last_migrated_pfn are in the same > block and wrongly rescan the block with finish_pageblock set.
Good catch. Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
> Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> > --- > mm/compaction.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/mm/compaction.c b/mm/compaction.c > index fb250c6b2b6e..ad535f880c70 100644 > --- a/mm/compaction.c > +++ b/mm/compaction.c > @@ -1123,6 +1123,7 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, > skip_updated = true; > if (test_and_set_skip(cc, valid_page) && > !cc->finish_pageblock) { > + low_pfn = end_pfn; > goto isolate_abort; > } > }
| |