[PATCH v5 2/2] riscv: patch: skip fixmap mapping when kernel text is already writable

Klara Modin klarasmodin at gmail.com
Fri Aug 14 05:04:53 PDT 2026


On 2026-08-14 08:27:42 +0000, Xiaofeng Yuan wrote:
> patch_map() always creates a temporary writable mapping via fixmap for
> kernel text addresses, even when CONFIG_STRICT_KERNEL_RWX is disabled
> and the kernel text is already mapped with _PAGE_WRITE.
> 
> This is unnecessary overhead at best, and on minimal configurations
> it can cause page faults.
> 
> Skip the fixmap path for kernel text when CONFIG_STRICT_KERNEL_RWX
> is not enabled, since the text pages are already writable in that case.
> The module text path is already gated on CONFIG_STRICT_MODULE_RWX and
> is kept unchanged.
> 
> Reported-by: Klara Modin <klara at kasm.eu>
> Closes: https://lore.kernel.org/all/ant_8TaBbov_GS4i@soda.int.kasm.eu/
> Reported-by: Lad Prabhakar <prabhakar.csengg at gmail.com>
> Closes: https://lore.kernel.org/all/CA+V-a8tQK8rih9SGGTyqrEBGpNkx4H0eX2YccCRrgkVAPr+EBg@mail.gmail.com/
> ---
> v5: fix the fixmap gating for kernel text. The v4 early return on
>     CONFIG_STRICT_MODULE_RWX wrongly skipped the fixmap for kernel text
>     too, which panics on configs with CONFIG_MODULES=n where
>     CONFIG_STRICT_MODULE_RWX is unavailable but CONFIG_STRICT_KERNEL_RWX
>     is still enabled and kernel text is read-only.
> v3: early return when !CONFIG_STRICT_MODULE_RWX (per Nam Cao's suggestion)
> v2: add commit description
> 
> Signed-off-by: Xiaofeng Yuan <xiaofengmian at 163.com>

This version works fine for me.

Thanks,
Tested-by: Klara Modin <klarasmodin at gmail.com>

> ---
>  arch/riscv/kernel/patch.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/arch/riscv/kernel/patch.c b/arch/riscv/kernel/patch.c
> index 16b243376f..2239c28981 100644
> --- a/arch/riscv/kernel/patch.c
> +++ b/arch/riscv/kernel/patch.c
> @@ -45,6 +45,8 @@ static __always_inline void *patch_map(void *addr, const unsigned int fixmap)
>  	phys_addr_t phys;
>  
>  	if (core_kernel_text(uintaddr) || is_kernel_exittext(uintaddr)) {
> +		if (!IS_ENABLED(CONFIG_STRICT_KERNEL_RWX))
> +			return addr;
>  		phys = __pa_symbol(addr);
>  	} else if (IS_ENABLED(CONFIG_STRICT_MODULE_RWX)) {
>  		struct page *page = vmalloc_to_page(addr);
> -- 
> 2.43.0
> 



More information about the linux-riscv mailing list