From: Zi Yan <[email protected]>
Whenever a buddy page is found, page_is_buddy() should be called to
check its validity. Add the missing check during pageblock merge check.
Fixes: 1dd214b8f21c ("mm: page_alloc: avoid merging non-fallbackable pageblocks with others")
Reported-by: Steven Rostedt <[email protected]>
Signed-off-by: Zi Yan <[email protected]>
---
mm/page_alloc.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index bdc8f60ae462..6c6af8658775 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -1108,6 +1108,9 @@ static inline void __free_one_page(struct page *page,
buddy_pfn = __find_buddy_pfn(pfn, order);
buddy = page + (buddy_pfn - pfn);
+
+ if (!page_is_buddy(page, buddy, order))
+ goto done_merging;
buddy_mt = get_pageblock_migratetype(buddy);
if (migratetype != buddy_mt
--
2.35.1
On Wed, Mar 30, 2022 at 3:12 PM Zi Yan <[email protected]> wrote:
>
> Fixes: 1dd214b8f21c ("mm: page_alloc: avoid merging non-fallbackable pageblocks with others")
Oh, btw - should this perhaps be backported further back than that
alleged "fixes" commit?
It does look like maybe the problem potentially existed before too,
and was just much harder to trigger.
That said, google doesn't find any other reports that look like
Steven's oops, so maybe it really never happened and backporting isn't
called for.
Or possibly my google-fu is just bad.
Linus