Re: [PATCH v8 0/3] Support runtime configuration for per-VM's HGATP mode
From: Anup Patel
Date: Fri Apr 03 2026 - 12:57:03 EST
On Fri, Apr 3, 2026 at 9:00 PM <fangyu.yu@xxxxxxxxxxxxxxxxx> wrote:
>
> From: Fangyu Yu <fangyu.yu@xxxxxxxxxxxxxxxxx>
>
> Currently, RISC-V KVM hardcodes the G-stage page table format (HGATP mode)
> to the maximum mode detected at boot time (e.g., SV57x4 if supported). but
> often such a wide GPA is unnecessary, just as a host sometimes doesn't need
> sv57.
>
> This patch reuse KVM_CAP_VM_GPA_BITS to select HGATP.MODE. User-space can
> now explicitly request a specific HGATP mode (SV39x4, SV48x4, SV57x4 or
> SV32x4) during VM creation.
>
> ---
> Changes in v8:
> - Reuse KVM_CAP_VM_GPA_BITS to advertise and select the effective GPA width
> for a VM (Anup's suggestion).
> - Handle the kvm == NULL case and task kvm->lock and kvm->slots_lock to serialize
> against concurrent vCPU creation and memslot updates (Radim's suggestion).
> - Link to v7:
> https://lore.kernel.org/linux-riscv/20260402132303.6252-1-fangyu.yu@xxxxxxxxxxxxxxxxx/
> ---
> Changes in v7 (Anup's suggestions):
> - Keep the original HGATP mode probing logic.
> - Link to v6:
> https://lore.kernel.org/linux-riscv/20260330122601.22140-1-fangyu.yu@xxxxxxxxxxxxxxxxx/
> ---
> Changes in v6 (Anup's suggestions):
> - Reworked kvm_riscv_gstage_gpa_bits() and kvm_riscv_gstage_gpa_size() to
> take "unsigned long pgd_levels" instead of "struct kvm_arch *".
> - Moved kvm_riscv_gstage_mode() helper from kvm_host.h to kvm_gstage.h.
> - Renamed kvm->arch.kvm_riscv_gstage_pgd_levels to kvm->arch.pgd_levels.
> - Added pgd_levels to struct kvm_gstage to avoid repeated
> gstage->kvm->arch pointer chasing.
> - Link to v5:
> https://lore.kernel.org/linux-riscv/20260204134507.33912-1-fangyu.yu@xxxxxxxxxxxxxxxxx/
> ---
> Changes in v5:
> - Use architectural HGATP.MODE encodings as the bit index for the supported-mode
> bitmap and for the VM-mode selection UAPI; no new UAPI mode/bit defines are
> introduced(per Radim).
> - Allow KVM_CAP_RISCV_SET_HGATP_MODE on RV32 as well(per Drew).
> - Link to v4:
> https://lore.kernel.org/linux-riscv/20260202140716.34323-1-fangyu.yu@xxxxxxxxxxxxxxxxx/
> ---
> Changes in v4:
> - Extend kvm_riscv_gstage_mode_detect() to probe all HGATP.MODE values
> supported by the host and record them in a bitmask.
> - Treat unexpected pgd_levels in kvm_riscv_gstage_mode() as an internal error
> (e.g. WARN_ON_ONCE())(per Radim).
> - Move kvm_riscv_gstage_gpa_bits() and kvm_riscv_gstage_gpa_size() to header
> as static inline helpers(per Radim).
> - Drop gstage_mode_user_initialized and Remove the kvm_debug() message from
> KVM_CAP_RISCV_SET_HGATP_MODE(per Radim).
> - Link to v3:
> https://lore.kernel.org/linux-riscv/20260125150450.27068-1-fangyu.yu@xxxxxxxxxxxxxxxxx/
> ---
> Changes in v3:
> - Reworked the patch formatting (per Drew).
> - Dropped kvm->arch.kvm_riscv_gstage_mode and derive HGATP.MODE from
> kvm_riscv_gstage_pgd_levels via a helper, avoiding redundant per-VM state(per Drew).
> - Removed kvm_riscv_gstage_max_mode and keep only kvm_riscv_gstage_max_pgd_levels
> for host capability detection(per Drew).
> - Other initialization and return value issues(per Drew).
> - Enforce that KVM_CAP_RISCV_SET_HGATP_MODE can only be enabled before any vCPUs
> are created by rejecting the ioctl once kvm->created_vcpus is non-zero(per Radim).
> - Add a memslot safety check and reject the capability unless
> kvm_are_all_memslots_empty(kvm) is true, ensuring the G-stage format is not
> changed after any memslots have been installed(per Radim).
> - Link to v2:
> https://lore.kernel.org/linux-riscv/20260105143232.76715-1-fangyu.yu@xxxxxxxxxxxxxxxxx/
>
> Fangyu Yu (3):
> RISC-V: KVM: Support runtime configuration for per-VM's HGATP mode
> RISC-V: KVM: Cache gstage pgd_levels in struct kvm_gstage
> RISC-V: KVM: Reuse KVM_CAP_VM_GPA_BITS to select HGATP.MODE
>
> arch/riscv/include/asm/kvm_gstage.h | 47 ++++++++++++++++---
> arch/riscv/include/asm/kvm_host.h | 1 +
> arch/riscv/kvm/gstage.c | 65 +++++++++++++--------------
> arch/riscv/kvm/main.c | 12 ++---
> arch/riscv/kvm/mmu.c | 70 +++++++++--------------------
> arch/riscv/kvm/vm.c | 49 ++++++++++++++++++--
> arch/riscv/kvm/vmid.c | 3 +-
> 7 files changed, 148 insertions(+), 99 deletions(-)
>
> --
> 2.50.1
>
This series is in good shape now. I will wait one more day to see
if there are any comments and after that I will merge for Linux-7.1
Thanks,
Anup