[PATCH hotfix] mm/compaction: handle free_pages_prepare() properly in compaction_free()
From: Zi Yan
Date: Mon Jun 22 2026 - 11:36:58 EST
free_pages_prepare() can fail but compaction_free() does not handle the
failure case. Failed pages should not be added back to cc->freepages for
future use, since they can be either PageHWPoison or free_page_is_bad()
and might cause data corruption.
Fixes: 733aea0b3a7bb ("mm/compaction: add support for >0 order folio memory compaction.")
Signed-off-by: Zi Yan <ziy@xxxxxxxxxx>
Cc: stable@xxxxxxxxxxxxxxx
---
free_pages_prepare() can fail if a page is PageHWPoison or
free_page_is_bad(). compaction_free() needs to handle these cases to
prevent failed pages being reused in cc->freepages.
---
mm/compaction.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/mm/compaction.c b/mm/compaction.c
index b776f35ad0200..f08765ade014c 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1875,15 +1875,14 @@ static void compaction_free(struct folio *dst, unsigned long data)
int order = folio_order(dst);
struct page *page = &dst->page;
- if (folio_put_testzero(dst)) {
- free_pages_prepare(page, order);
+ if (folio_put_testzero(dst) && free_pages_prepare(page, order)) {
list_add(&dst->lru, &cc->freepages[order]);
cc->nr_freepages += 1 << order;
}
cc->nr_migratepages += 1 << order;
/*
- * someone else has referenced the page, we cannot take it back to our
- * free list.
+ * someone else has referenced the page or free_pages_prepare() fails,
+ * we cannot take it back to our free list.
*/
}
---
base-commit: 13a1e1a618858407fa12c391f664ea750651f6b2
change-id: 20260621-handle_free_pages_prepare_in_compaction_free-7cca3ff08367
Best regards,
--
Zi Yan <ziy@xxxxxxxxxx>