[PATCH 0/3] optimize pgtable_l4|l5_enabled
From: Jisheng Zhang
Date: Sun Aug 30 2026 - 13:24:08 EST
In 2022, I tried to optimize pgtable_l4|l5_enabled use static branch[3]
But as is known, static branch has some drawbacks.
This series is another round of optmizing pgtable_l4|l5_enabled, but
with another mechanism. Below the is normal cover-letter.
The pgtable_l4|[l5]_enabled check sits at hot code path, performance
is impacted a lot. Since pgtable_l4|[l5]_enabled isn't changed after
boot, we can use alternative mechanism to optimize them.
So the question is whether we can add RISCV_ISA_EXT_SV48/SV5 and use
riscv_has_extension_*() or not. Although, per [1] and [2], SV48 and
SV57 are ISA exensions too, RISCV_ISA_EXT_SV48/SV57 are to describe hw
supported extensions, while this doesn't mean the pgtable_l4|l5 is
enabled, for example, we may pass no5lvl/no4lvl kernel boot args or
explicitly ask for SV39 by setting dt mmu-type property as
"riscv,sv39". If we clear RISCV_ISA_EXT_SV48|SV57, then internal
extension queries and potentially userspace reporting can no longer
distinguish “unsupported” from “supported but disabled.”
Introduce cap framework to describe the capabilities selected by
kernel. It also uses similar alternatives mechanism as the
riscv_has_extension_*() helpers.
After that, use it to optimize pgtable_l4|l5_enabled.
For the typical access_ok(addr, 1);
before the patch:
...
auipc a5,0xb43
lbu a5,100(a5) # ffffffff80b51f68 <pgtable_l5_enabled>
bnez a5,ffffffff8000ef46 <foo+0x56>
auipc a5,0xb43
lbu a5,91(a5) # ffffffff80b51f69 <pgtable_l4_enabled>
beqz a5,ffffffff8000ef5a <foo+0x6a>
...
after the patch:
there are only two j or nop instructions which avoid memory load and
test branch.
Initial test lmbench's lat_syscall write on TH1520 platforms shows that
the write syscall latency is reduced by about 2.38%.
Signed-off-by: Jisheng Zhang <jszhang@xxxxxxxxxx>
Link: https://github.com/riscv/riscv-isa-manual/blob/main/src/profiles/profiles.adoc [1]
Link: https://riscv.atlassian.net/wiki/spaces/HOME/pages/16154732/Ratified+ISA+Extensions [2]
Jisheng Zhang (3):
riscv: remove RISCV_ALTERNATIVE Kconfig option
riscv: convert pgtable_l4|l5_enabled to inline function
riscv: introduce cap framework and use it to optimize
pgtable_l4|l5_enabled
arch/riscv/Kconfig | 24 +------
arch/riscv/Kconfig.errata | 5 +-
arch/riscv/include/asm/alternative-macros.h | 24 -------
arch/riscv/include/asm/alternative.h | 12 +---
arch/riscv/include/asm/cpufeature-macros.h | 54 +++++++++++++--
arch/riscv/include/asm/cpufeature.h | 8 +--
arch/riscv/include/asm/hwcap.h | 6 ++
arch/riscv/include/asm/pgalloc.h | 14 ++--
arch/riscv/include/asm/pgtable-32.h | 4 +-
arch/riscv/include/asm/pgtable-64.h | 62 +++++++++++------
arch/riscv/include/asm/pgtable.h | 4 +-
arch/riscv/include/asm/vendor_extensions.h | 18 ++---
arch/riscv/include/asm/vmalloc.h | 5 +-
arch/riscv/kernel/Makefile | 2 +-
arch/riscv/kernel/alternative.c | 24 +++++--
arch/riscv/kernel/cpu.c | 4 +-
arch/riscv/kernel/cpufeature.c | 43 +++++++++---
arch/riscv/mm/init.c | 73 ++++++++++++---------
arch/riscv/mm/kasan_init.c | 20 +++---
arch/riscv/mm/pgtable.c | 4 +-
arch/riscv/mm/ptdump.c | 4 +-
21 files changed, 230 insertions(+), 184 deletions(-)
--
2.53.0