[PATCHv2 02/14] mm/sparse: Check memmap alignment
From: Kiryl Shutsemau
Date: Thu Dec 18 2025 - 10:09:57 EST
The upcoming changes in compound_head() require memmap to be naturally
aligned to the maximum folio size.
Add a warning if it is not.
A warning is sufficient as MAX_FOLIO_ORDER is very rarely used, so the
kernel is still likely to be functional if this strict check fails.
Signed-off-by: Kiryl Shutsemau <kas@xxxxxxxxxx>
---
include/linux/mmzone.h | 1 +
mm/sparse.c | 3 +++
2 files changed, 4 insertions(+)
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 6cfede39570a..9f44dc760cdc 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -91,6 +91,7 @@
#endif
#define MAX_FOLIO_NR_PAGES (1UL << MAX_FOLIO_ORDER)
+#define MAX_FOLIO_SIZE (PAGE_SIZE << MAX_FOLIO_ORDER)
enum migratetype {
MIGRATE_UNMOVABLE,
diff --git a/mm/sparse.c b/mm/sparse.c
index 17c50a6415c2..c5810ff7c6f7 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -600,6 +600,9 @@ void __init sparse_init(void)
BUILD_BUG_ON(!is_power_of_2(sizeof(struct mem_section)));
memblocks_present();
+ WARN_ON(!IS_ALIGNED((unsigned long)pfn_to_page(0),
+ MAX_FOLIO_SIZE / sizeof(struct page)));
+
pnum_begin = first_present_section_nr();
nid_begin = sparse_early_nid(__nr_to_section(pnum_begin));
--
2.51.2