Messages in this thread Patch in this message | | | From | Kemeng Shi <> | Subject | [PATCH v2 3/7] mm/compaction: correctly return failure with bogus compound_order in strict mode | Date | Sat, 26 Aug 2023 23:36:13 +0800 |
| |
In strict mode, we should return 0 if there is any hole in pageblock. If we successfully isolated pages at beginning at pageblock and then have a bogus compound_order outside pageblock in next page. We will abort search loop with blockpfn > end_pfn. Although we will limit blockpfn to end_pfn, we will treat it as a successful isolation in strict mode as blockpfn is not < end_pfn and return partial isolated pages. Then isolate_freepages_range may success unexpectly with hole in isolated range.
Fixes: 9fcd6d2e052ee ("mm, compaction: skip compound pages by order in free scanner") Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com> --- mm/compaction.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/mm/compaction.c b/mm/compaction.c index a40550a33aee..b4d03c9ffe7c 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -631,6 +631,14 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, page += (1UL << order) - 1; nr_scanned += (1UL << order) - 1; } + /* + * There is a tiny chance that we have read bogus + * compound_order(), so be careful to not go outside + * of the pageblock. + */ + if (unlikely(blockpfn >= end_pfn)) + blockpfn = end_pfn - 1; + goto isolate_fail; } @@ -678,8 +686,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, spin_unlock_irqrestore(&cc->zone->lock, flags); /* - * There is a tiny chance that we have read bogus compound_order(), - * so be careful to not go outside of the pageblock. + * Be careful to not go outside of the pageblock. */ if (unlikely(blockpfn > end_pfn)) blockpfn = end_pfn; -- 2.30.0
| |