Re: [PATCH v7] KVM: riscv: Skip CSR restore if VCPU is reloaded on the same core

From: Radim Krčmář

Date: Fri Feb 27 2026 - 09:09:31 EST


2026-02-27T20:10:08+08:00, Jinyu Tang <tjytimi@xxxxxxx>:
> Currently, kvm_arch_vcpu_load() unconditionally restores guest CSRs,
> HGATP, and AIA state. However, when a VCPU is loaded back on the same
> physical CPU, and no other KVM VCPU has run on this CPU since it was
> last put, the hardware CSRs and AIA registers are still valid.
>
> This patch optimizes the vcpu_load path by skipping the expensive CSR
> and AIA writes if all the following conditions are met:
> 1. It is being reloaded on the same CPU (vcpu->arch.last_exit_cpu == cpu).
> 2. The CSRs are not dirty (!vcpu->arch.csr_dirty).
> 3. No other VCPU used this CPU (vcpu == __this_cpu_read(kvm_former_vcpu)).
>
> To ensure this fast-path doesn't break corner cases:
> - Live migration and VCPU reset are naturally safe. KVM initializes
> last_exit_cpu to -1, which guarantees the fast-path won't trigger.
> - The 'csr_dirty' flag tracks runtime userspace interventions. If
> userspace modifies guest configurations (e.g., hedeleg via
> KVM_SET_GUEST_DEBUG, or CSRs including AIA via KVM_SET_ONE_REG),
> the flag is set to skip the fast path.
>
> With the 'csr_dirty' safeguard proven effective, it is safe to
> include kvm_riscv_vcpu_aia_load() inside the skip logic now.
>
> Signed-off-by: Jinyu Tang <tjytimi@xxxxxxx>
> ---
> v6 -> v7:
> - Moved kvm_riscv_vcpu_aia_load() into the fast-path skip logic, as
> suggested by Radim Krčmář.
> - Verified the fix for the IMSIC instability issue reported in v3.
> Testing was conducted on QEMU 10.0.2 with explicitly enabled AIA
> (`-machine virt,aia=aplic-imsic`). The guest boots successfully
> using virtio-mmio devices like virtio-blk and virtio-net.

Reviewed-by: Radim Krčmář <radim.krcmar@xxxxxxxxxxxxxxxx>

Thanks.