[PATCH RFC 05/18] x86/mm/pat: use a generic helper for the large page size

From: Mike Rapoport (Microsoft)

Date: Tue Jul 21 2026 - 12:31:35 EST


__should_split_large_page() uses x86 specific page_level_size() to
calculate the size and mask of the large page.

In preparation to moving core parts of change_page_attr() to common
code, introduce generic pgtable_level_size() and pgtable_level_mask()
helpers and use them in __should_split_large_page().

No functional change intended.

Assisted-by: Copilot:claude-opus-4.8
Signed-off-by: Mike Rapoport (Microsoft) <rppt@xxxxxxxxxx>
---
arch/x86/mm/pat/set_memory.c | 4 ++--
include/linux/pgtable.h | 22 ++++++++++++++++++++++
2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c
index 8a1782f5de3e..ee40962d4ee9 100644
--- a/arch/x86/mm/pat/set_memory.c
+++ b/arch/x86/mm/pat/set_memory.c
@@ -956,8 +956,8 @@ static int __should_split_large_page(pte_t *kpte, unsigned long address,
return -EINVAL;
}

- psize = page_level_size(level);
- pmask = page_level_mask(level);
+ psize = pgtable_level_size(level);
+ pmask = pgtable_level_mask(level);

/*
* Calculate the number of pages, which fit into this large
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
index 4b42ac5c27d9..9eb00ad6d5d2 100644
--- a/include/linux/pgtable.h
+++ b/include/linux/pgtable.h
@@ -2364,6 +2364,28 @@ static inline const char *pgtable_level_to_str(enum pgtable_level level)
}
}

+/* Size of the memory mapped by a single leaf entry at @level */
+static inline unsigned long pgtable_level_size(enum pgtable_level level)
+{
+ switch (level) {
+ case PGTABLE_LEVEL_PTE:
+ return PAGE_SIZE;
+ case PGTABLE_LEVEL_PMD:
+ return PMD_SIZE;
+ case PGTABLE_LEVEL_PUD:
+ return PUD_SIZE;
+ case PGTABLE_LEVEL_P4D:
+ return P4D_SIZE;
+ default:
+ return PGDIR_SIZE;
+ }
+}
+
+static inline unsigned long pgtable_level_mask(enum pgtable_level level)
+{
+ return ~(pgtable_level_size(level) - 1);
+}
+
#endif /* !__ASSEMBLY__ */

#if !defined(MAX_POSSIBLE_PHYSMEM_BITS) && !defined(CONFIG_64BIT)

--
2.53.0