[PATCH 0/6] arch, mm/execmem: resolve confusion about set_direct_map_valid_noflush()
Mike Rapoport (Microsoft)
rppt at kernel.org
Sun Aug 16 03:59:23 PDT 2026
Recent discussion about implementation of execmem's ROX caches on arm64
revealed a confusion about how set_direct_map_valid_noflush()
implemented on different architectures.
On arm64 it sets or clears the PTE_VALID bit marking a PTE as present or
not present.
On other architectures it's a range version of
set_direct_map_invalid_noflush() and set_direct_map_default_noflush()
Unlike arm64::set_direct_map_valid_noflush(),
set_direct_map_default_noflush() not only marks PTE as present, but also
sets its default protection mode.
Other than that, initial design of execmem ROX caches didn't rely on
restoration of large mappings that's now available on x86, but
completely removed the memory allocated for the ROX cache from the
direct map to ensure that large mappings are not split. This precluded
usage of VM_FLUSH_RESET_PERMS for the ROX cache allocations and required
execmem to implement manipulation of the direct map alias.
Current implementation of ROX caches does not remove the direct map
alias but simply calls set_memory_rox() that updates the permissions in
both vmalloc address space and the direct map and relies on
collapse_large_pages() in x86 CPA to keep large mappings.
This allow using VM_FLUSH_RESET_PERMS for execmem ROX cache allocations
with small adjustments to set_direct_map APIs and vmalloc::reset_perms()
behaviour: adding number of pages parameter to set_direct_map APIs and
making resetting of the direct map permissions in vmalloc VMAP_HUGE
friendly.
Implement these adjustments, make execmem always use
VM_FLUSH_RESET_PERMS and revert set_direct_map_valid_noflush() changes.
[1] https://lore.kernel.org/all/20260611130144.1385343-4-abarnas@google.com
---
Mike Rapoport (Microsoft) (6):
set_memory: add number of pages parameter to set_direct_map APIs
mm/vmalloc: set area's page_order after allocation succeeds
mm/vmalloc: constify vm parameter of get_vm_area_page_order()
mm/vmalloc: make set_area_direct_map HUGE_VMAP friendly
mm/execmem: use VM_FLUSH_RESET_PERMS for ROX cache allocations
Revert "arch: introduce set_direct_map_valid_noflush()"
arch/arm64/include/asm/set_memory.h | 5 ++--
arch/arm64/mm/pageattr.c | 24 ++++---------------
arch/loongarch/include/asm/set_memory.h | 5 ++--
arch/loongarch/mm/pageattr.c | 27 ++++-----------------
arch/riscv/include/asm/set_memory.h | 5 ++--
arch/riscv/mm/pageattr.c | 23 ++++--------------
arch/s390/include/asm/set_memory.h | 5 ++--
arch/s390/mm/pageattr.c | 20 ++++------------
arch/x86/include/asm/set_memory.h | 5 ++--
arch/x86/mm/pat/set_memory.c | 16 ++++---------
include/linux/set_memory.h | 12 ++++------
kernel/power/snapshot.c | 4 ++--
mm/execmem.c | 42 ++++++---------------------------
mm/secretmem.c | 6 ++---
mm/vmalloc.c | 31 ++++++++++++++++--------
mm/vmalloc.h | 2 +-
16 files changed, 68 insertions(+), 164 deletions(-)
---
base-commit: 1029098ee3275ea5b78e329ce132262affa2f8cc
change-id: 20260816-execmem-set-vm-perms-v0-2-bae847a4f64f
--
Sincerely yours,
Mike.
More information about the linux-riscv
mailing list