Re: [PATCH v6 2/3] arm64/mm: add set_direct_map_ro_noflush()

From: David Hildenbrand (Arm)

Date: Tue Aug 25 2026 - 11:56:43 EST


On 7/30/26 11:06, Xueyuan Chen wrote:
> Implement set_direct_map_ro_noflush() for arm64 with update_range_prot() on
> the linear map, setting PTE_RDONLY and clearing PTE_WRITE. Keep the
> existing can_set_direct_map() guard and leave TLB invalidation to the
> caller.
>
> Co-developed-by: Lance Yang <lance.yang@xxxxxxxxx>
> Signed-off-by: Lance Yang <lance.yang@xxxxxxxxx>
> Signed-off-by: Xueyuan Chen <xueyuan.chen21@xxxxxxxxx>
> ---
> arch/arm64/include/asm/set_memory.h | 2 ++
> arch/arm64/mm/pageattr.c | 10 ++++++++++
> 2 files changed, 12 insertions(+)
>
> diff --git a/arch/arm64/include/asm/set_memory.h b/arch/arm64/include/asm/set_memory.h
> index 90f61b17275e..7083260303c3 100644
> --- a/arch/arm64/include/asm/set_memory.h
> +++ b/arch/arm64/include/asm/set_memory.h
> @@ -14,6 +14,8 @@ int set_memory_valid(unsigned long addr, int numpages, int enable);
> int set_direct_map_invalid_noflush(struct page *page);
> int set_direct_map_default_noflush(struct page *page);
> int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid);
> +int set_direct_map_ro_noflush(const void *addr, unsigned long nr_pages);
> +#define set_direct_map_ro_noflush set_direct_map_ro_noflush
> bool kernel_page_present(struct page *page);
>
> int set_memory_encrypted(unsigned long addr, int numpages);
> diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c
> index ce035e1b4eaf..c51236b61651 100644
> --- a/arch/arm64/mm/pageattr.c
> +++ b/arch/arm64/mm/pageattr.c
> @@ -365,6 +365,16 @@ int set_direct_map_valid_noflush(struct page *page, unsigned nr, bool valid)
> return set_memory_valid(addr, nr, valid);
> }
>
> +int set_direct_map_ro_noflush(const void *addr, unsigned long nr_pages)
> +{
> + if (!can_set_direct_map())
> + return 0;
> +
> + return update_range_prot((unsigned long)addr, PAGE_SIZE * nr_pages,
> + __pgprot(PTE_RDONLY),
> + __pgprot(PTE_WRITE));
> +}
> +
> #ifdef CONFIG_DEBUG_PAGEALLOC
> /*
> * This is - apart from the return value - doing the same

We'll need an ACK from arm64 maintaines. To me this looks good.

--
Cheers,

David