[PATCH 08/15] mm/compaction: stop casting free pages to struct folio

From: Nilay Vaish

Date: Tue Sep 29 2026 - 17:54:31 EST


As part of the memdescs effort, struct folio will be allocated
separately from struct page and will no longer overlay the head page.

In compaction_alloc_noprof(), pass freepage directly to
post_alloc_hook(), set_page_refcounted(), prep_compound_page(), and
page_rmappable_folio() instead of casting freepage to struct folio *
prematurely and referencing &dst->page. In compaction_free(), use
folio_page(dst, 0) and add &page->lru to the struct page freelist
cc->freepages[order] after free_pages_prepare().

No functional change intended.

Assisted-by: LLM
Signed-off-by: Nilay Vaish <nilayvaish@xxxxxxxxxx>
---
mm/compaction.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/mm/compaction.c b/mm/compaction.c
index f1b2060eb201..d708d973250a 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1845,7 +1845,6 @@ static void isolate_freepages(struct compact_control *cc)
static struct folio *compaction_alloc_noprof(struct folio *src, unsigned long data)
{
struct compact_control *cc = (struct compact_control *)data;
- struct folio *dst;
int order = folio_order(src);
bool has_isolated_pages = false;
int start_order;
@@ -1878,15 +1877,13 @@ static struct folio *compaction_alloc_noprof(struct folio *src, unsigned long da

list_add(&freepage[size].lru, &cc->freepages[start_order]);
}
- dst = (struct folio *)freepage;
-
- post_alloc_hook(&dst->page, order, __GFP_MOVABLE, ALLOC_DEFAULT);
- set_page_refcounted(&dst->page);
+ post_alloc_hook(freepage, order, __GFP_MOVABLE, ALLOC_DEFAULT);
+ set_page_refcounted(freepage);
if (order)
- prep_compound_page(&dst->page, order);
+ prep_compound_page(freepage, order);
cc->nr_freepages -= 1 << order;
cc->nr_migratepages -= 1 << order;
- return page_rmappable_folio(&dst->page);
+ return page_rmappable_folio(freepage);
}

static struct folio *compaction_alloc(struct folio *src, unsigned long data)
@@ -1903,10 +1900,10 @@ static void compaction_free(struct folio *dst, unsigned long data)
{
struct compact_control *cc = (struct compact_control *)data;
int order = folio_order(dst);
- struct page *page = &dst->page;
+ struct page *page = folio_page(dst, 0);

if (folio_put_testzero(dst) && free_pages_prepare(page, order)) {
- list_add(&dst->lru, &cc->freepages[order]);
+ list_add(&page->lru, &cc->freepages[order]);
cc->nr_freepages += 1 << order;
}
cc->nr_migratepages += 1 << order;
--
2.56.0.rc1.315.gc6ed9934b7-goog