If page->compound_info encodes a mask, it is expected that 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@kernel.org>
---
include/linux/mmzone.h | 1 +
mm/sparse.c | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 590d1a494c4c..322ed4c42cfc 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -92,6 +92,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..5f41a3edcc24 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -600,6 +600,11 @@ void __init sparse_init(void)
BUILD_BUG_ON(!is_power_of_2(sizeof(struct mem_section)));
memblocks_present();
+ if (compound_info_has_mask()) {
+ 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