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