Re: [PATCHv2 02/14] mm/sparse: Check memmap alignment

From: Muchun Song

Date: Mon Dec 22 2025 - 03:34:59 EST




On 2025/12/18 23:09, Kiryl Shutsemau wrote:
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.

Different architectures default to 2 MB alignment (mainly to
enable huge mappings), which only accommodates folios up to
128 MB. Yet 1 GB huge pages are still fairly common, so
validating 16 GB (MAX_FOLIO_SIZE) alignment seems likely to
miss the most frequent case.

I’m concerned that this might plant a hidden time bomb: it
could detonate at any moment in later code, silently triggering
memory corruption or similar failures. Therefore, I don’t
think a WARNING is a good choice.


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));