As part of the memdescs effort, struct folio will be allocated separately from struct page and will no longer overlay the head page. Replace &folio->page with folio_page(folio, 0) in __folio_put() and free_unref_folios(). No functional change intended. Assisted-by: LLM Signed-off-by: Nilay Vaish --- mm/folio.c | 2 +- mm/page_alloc.c | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/mm/folio.c b/mm/folio.c index 35e242b48870..978565add078 100644 --- a/mm/folio.c +++ b/mm/folio.c @@ -103,7 +103,7 @@ void __folio_put(struct folio *folio) page_cache_release(folio); folio_unqueue_deferred_split(folio); mem_cgroup_uncharge(folio); - free_frozen_pages(&folio->page, folio_order(folio)); + free_frozen_pages(folio_page(folio, 0), folio_order(folio)); } EXPORT_SYMBOL(__folio_put); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 07e03c7c7771..2f8cd3da199d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3006,17 +3006,18 @@ void free_unref_folios(struct folio_batch *folios) /* Prepare folios for freeing */ for (i = 0, j = 0; i < folios->nr; i++) { struct folio *folio = folios->folios[i]; + struct page *page = folio_page(folio, 0); unsigned long pfn = folio_pfn(folio); unsigned int order = folio_order(folio); - if (!__free_pages_prepare(&folio->page, order, FPI_NONE)) + if (!__free_pages_prepare(page, order, FPI_NONE)) continue; /* * Free orders not handled on the PCP directly to the * allocator. */ if (!pcp_allowed_order(order)) { - free_one_page(folio_zone(folio), &folio->page, + free_one_page(folio_zone(folio), page, pfn, order, FPI_NONE); continue; } @@ -3029,13 +3030,14 @@ void free_unref_folios(struct folio_batch *folios) for (i = 0; i < folios->nr; i++) { struct folio *folio = folios->folios[i]; + struct page *page = folio_page(folio, 0); struct zone *zone = folio_zone(folio); unsigned long pfn = folio_pfn(folio); unsigned int order = (unsigned long)folio->private; int migratetype; folio->private = NULL; - migratetype = get_pfnblock_migratetype(&folio->page, pfn); + migratetype = get_pfnblock_migratetype(page, pfn); /* Different zone requires a different pcp lock */ if (zone != locked_zone || @@ -3051,7 +3053,7 @@ void free_unref_folios(struct folio_batch *folios) * allocator, see comment in free_frozen_pages. */ if (is_migrate_isolate(migratetype)) { - free_one_page(zone, &folio->page, pfn, + free_one_page(zone, page, pfn, order, FPI_NONE); continue; } @@ -3062,7 +3064,7 @@ void free_unref_folios(struct folio_batch *folios) */ pcp = pcp_spin_trylock(zone->per_cpu_pageset); if (unlikely(!pcp)) { - free_one_page(zone, &folio->page, pfn, + free_one_page(zone, page, pfn, order, FPI_NONE); continue; } @@ -3076,9 +3078,9 @@ void free_unref_folios(struct folio_batch *folios) if (unlikely(migratetype >= MIGRATE_PCPTYPES)) migratetype = MIGRATE_MOVABLE; - trace_mm_page_free_batched(&folio->page); - if (!free_frozen_page_commit(zone, pcp, &folio->page, - migratetype, order, FPI_NONE)) { + trace_mm_page_free_batched(page); + if (!free_frozen_page_commit(zone, pcp, page, + migratetype, order, FPI_NONE)) { pcp = NULL; locked_zone = NULL; } -- 2.56.0.rc1.315.gc6ed9934b7-goog