[PATCH] RISC-V: KVM: Add kvm-riscv.wfi_trap_policy to control VS-mode WFI trapping
"Yuhang.chen" <[email protected]> Thu, 9 Jul 2026 19:56:10 +0800
| Newsgroups | org.infradead.lists.kvm-riscv,org.infradead.lists.linux-riscv,org.kernel.vger.kvm,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Add a kernel command-line option, kvm-riscv.wfi_trap_policy=trap|notrap, that controls whether a WFI executed by a VS-mode guest traps into KVM (HS-mode) or executes natively. Measured results (wfi_exit_stat delta / guest wake count over 3 s): policy WFI_EXITS WAKE_CNT ---------- --------- -------- default 295 294 (== trap, no regression) trap 295 294 notrap 0 298 Assisted-by: YuanSheng:deepseek-v4-pro Co-developed-by: Quan Zhou <[email protected]> Signed-off-by: Quan Zhou <[email protected]> Signed-off-by: Yuhang.chen <[email protected]> --- .../admin-guide/kernel-parameters.txt | 14 ++++++ arch/riscv/kvm/vcpu.c | 44 ++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index b5493a7f8f22..ee6603b30033 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -3254,6 +3254,20 @@ Kernel parameters notrap: clear WFI instruction trap + kvm-riscv.wfi_trap_policy= + [KVM,RISCV] Control when to set the WFI instruction + trap for KVM VMs. When set, a VS-mode WFI traps into + KVM and is emulated; when clear, the guest executes + WFI natively and blocks until a VS-mode interrupt + (e.g. the sstc timer) is pending. + + trap: set WFI instruction trap (HSTATUS.VTW=1) + + notrap: clear WFI instruction trap (HSTATUS.VTW=0) + + Defaults to trap, preserving the previous + unconditional behavior. + kvm_cma_resv_ratio=n [PPC,EARLY] Reserves given percentage from system memory area for contiguous memory allocation for KVM hash pagetable diff --git a/arch/riscv/kvm/vcpu.c b/arch/riscv/kvm/vcpu.c index c3672513b4e9..d50b47ed280e 100644 --- a/arch/riscv/kvm/vcpu.c +++ b/arch/riscv/kvm/vcpu.c @@ -12,6 +12,7 @@ #include <linux/kdebug.h> #include <linux/module.h> #include <linux/percpu.h> +#include <linux/string.h> #include <linux/vmalloc.h> #include <linux/sched/signal.h> #include <linux/fs.h> @@ -26,6 +27,42 @@ static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_former_vcpu); +/* + * WFI trap policy for VS-mode guests, controllable through the + * kvm-riscv.wfi_trap_policy= kernel command-line option. + */ +enum kvm_riscv_wfi_trap_policy { + KVM_RISCV_WFI_TRAP, /* Default: trap VS-mode WFI into KVM */ + KVM_RISCV_WFI_NOTRAP, /* Let VS-mode WFI execute natively */ +}; + +static enum kvm_riscv_wfi_trap_policy kvm_riscv_wfi_trap_policy __read_mostly = + KVM_RISCV_WFI_TRAP; + +static int __init early_kvm_riscv_wfi_trap_policy_cfg(char *arg) +{ + if (!arg) + return -EINVAL; + + if (strcmp(arg, "trap") == 0) { + kvm_riscv_wfi_trap_policy = KVM_RISCV_WFI_TRAP; + return 0; + } + + if (strcmp(arg, "notrap") == 0) { + kvm_riscv_wfi_trap_policy = KVM_RISCV_WFI_NOTRAP; + return 0; + } + + return -EINVAL; +} +early_param("kvm-riscv.wfi_trap_policy", early_kvm_riscv_wfi_trap_policy_cfg); + +static bool kvm_riscv_vcpu_wfi_should_trap(struct kvm_vcpu *vcpu) +{ + return kvm_riscv_wfi_trap_policy == KVM_RISCV_WFI_TRAP; +} + const struct kvm_stats_desc kvm_vcpu_stats_desc[] = { KVM_GENERIC_VCPU_STATS(), STATS_DESC_COUNTER(VCPU, ecall_exit_stat), @@ -73,7 +110,12 @@ static void kvm_riscv_vcpu_context_reset(struct kvm_vcpu *vcpu, /* Setup reset state of shadow SSTATUS and HSTATUS CSRs */ cntx->sstatus = SR_SPP | SR_SPIE; - cntx->hstatus |= HSTATUS_VTW; + /* + * Trap VS-mode WFI into KVM unless the WFI trap policy lets the guest + * execute it natively. See kvm_riscv_wfi_trap_policy. + */ + if (kvm_riscv_vcpu_wfi_should_trap(vcpu)) + cntx->hstatus |= HSTATUS_VTW; cntx->hstatus |= HSTATUS_SPVP; cntx->hstatus |= HSTATUS_SPV; } -- 2.34.1 -- kvm-riscv mailing list [email protected] http://lists.infradead.org/mailman/listinfo/kvm-riscv