[PATCH v1 3/4] arm64: mm: Introduce linear_map_needs_set() helper
From: Vincent Donnefort <hidden>
Date: 2026-09-18 13:19:06
Also in:
linux-pm, lkml
Subsystem:
arm64 port (aarch64 architecture), the rest · Maintainers:
Catalin Marinas, Will Deacon, Linus Torvalds
can_set_direct_map() is intended as an external query function, but is also being called internally by map_mem() to initialise linear_map_requires_bbml3, duplicating the feature checks already present in force_pte_mapping(). Factor the list of features that require modifying linear map attributes into a shared helper linear_map_needs_set(). Signed-off-by: Vincent Donnefort <redacted> --- arch/arm64/include/asm/mmu.h | 1 + arch/arm64/mm/mmu.c | 22 ++++++++++++++++++++-- arch/arm64/mm/pageattr.c | 12 +----------- 3 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h
index 5e1211c540ab..12ed21e2d0d7 100644
--- a/arch/arm64/include/asm/mmu.h
+++ b/arch/arm64/include/asm/mmu.h@@ -70,6 +70,7 @@ extern void create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys, pgprot_t prot, bool page_mappings_only); extern void *fixmap_remap_fdt(phys_addr_t dt_phys, int *size, pgprot_t prot); extern void mark_linear_text_alias_ro(void); +extern bool linear_map_needs_set(void); extern int split_kernel_leaf_mapping(unsigned long start, unsigned long end); extern void linear_map_maybe_split_to_ptes(void);
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 79d90226fd5d..c18ed601f0a8 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c@@ -776,6 +776,24 @@ static int split_kernel_leaf_mapping_locked(unsigned long addr) return ret; } +/* + * True if the linear map needs to be modified for one of the following + * features: + * + * rodata_full and DEBUG_PAGEALLOC need to protect/unprotect pages in + * the linear map. + * + * KFENCE pool needs to protect/unprotect pages in the linear map if + * initialized late. + * + * Realms need to mark pages shared/protected in the linear map. + */ +bool linear_map_needs_set(void) +{ + return rodata_full || debug_pagealloc_enabled() || + arm64_kfence_can_set_direct_map() || is_realm_world(); +} + static inline bool force_pte_mapping(void) { const bool bbml3 = system_capabilities_finalized() ?
@@ -785,7 +803,7 @@ static inline bool force_pte_mapping(void) return true; if (bbml3) return false; - return rodata_full || arm64_kfence_can_set_direct_map() || is_realm_world(); + return linear_map_needs_set(); } static DEFINE_MUTEX(pgtable_split_lock);
@@ -1203,7 +1221,7 @@ static void __init map_mem(void) arm64_kfence_map_pool(); - linear_map_requires_bbml3 = !force_pte_mapping() && can_set_direct_map(); + linear_map_requires_bbml3 = !force_pte_mapping() && linear_map_needs_set(); if (force_pte_mapping()) flags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
index bbe98ac9ad8c..c1ba74eb602f 100644
--- a/arch/arm64/mm/pageattr.c
+++ b/arch/arm64/mm/pageattr.c@@ -89,17 +89,7 @@ bool rodata_full __ro_after_init = true; bool can_set_direct_map(void) { - /* - * rodata_full, DEBUG_PAGEALLOC and a Realm guest all require linear - * map to be mapped at page granularity, so that it is possible to - * protect/unprotect single pages. - * - * KFENCE pool requires page-granular mapping if initialized late. - * - * Realms need to make pages shared/protected at page granularity. - */ - return rodata_full || debug_pagealloc_enabled() || - arm64_kfence_can_set_direct_map() || is_realm_world(); + return linear_map_needs_set(); } static int update_range_prot(unsigned long start, unsigned long size,
--
2.55.0.1082.g2b9226bbc0-goog