The max order page has no buddy page and never merge to other order. So isolating and then freeing it is pointless. And if order == MAX_ORDER - 1, then the buddy can actually be a !pfn_valid() in some corner case? pfn_valid_within(buddy_pfn) that follows would only catch it on archs with holes in zone. Then is_migrate_isolate_page(buddy) might access an invalid buddy. So this is also a bug fix. Fixes: 3c605096d315 ("mm/page_alloc: restrict max order of merging on isolated pageblock") Signed-off-by: Muchun Song <songmuchun@xxxxxxxxxxxxx> Acked-by: Vlastimil Babka <vbabka@xxxxxxx> --- Changes in v2: - Add Fixes tag in the commit log. mm/page_isolation.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm/page_isolation.c b/mm/page_isolation.c index a254e1f370a3..bddf788f45bf 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -88,7 +88,7 @@ static void unset_migratetype_isolate(struct page *page, unsigned migratetype) */ if (PageBuddy(page)) { order = buddy_order(page); - if (order >= pageblock_order) { + if (order >= pageblock_order && order < MAX_ORDER - 1) { pfn = page_to_pfn(page); buddy_pfn = __find_buddy_pfn(pfn, order); buddy = page + (buddy_pfn - pfn); -- 2.11.0