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 Cc: stable@vger.kernel.org --- 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