Re: [PATCH v5 0/3] RISC-V: KVM: fix vcpu vector context handling

Anup Patel <[email protected]>
Newsgroups org.infradead.lists.kvm-riscv,org.infradead.lists.linux-riscv,org.kernel.vger.linux-kernel
Message-ID <CAAhSdy01c0qnkAwzGj6rE6owb3h+KPSEbpPCBpMWhXZg66D0dg@mail.gmail.com>
On Tue, Aug 4, 2026 at 3:23 AM Andy Chiu <[email protected]> wrote:
>
> This series fixes a vtype corruption encountered when running perf +
> vector workload on KVM.
>
> The root cause of the bug is that the kernel-mode vector (KMV)
> misattributes the guest's vcpu context as the user's context. To solve
> this, we need to correctly save the vcpu context when the kernel-mode
> vector is serving a guest.
>
> However, calling directly into KVM from RISC-V generic architecture code
> creates a reverse dependency, which is problematic when KVM is built as
> a module. To address this, we introduce an RCU-protected callback for
> context flushing, which KVM registers during module init.
>
> Patch 1 is a preparatory cleanup that refactors
> riscv_v_start_kernel_context().
> Patch 2 prepares get/put_cpu_vector_context() for gaurding the use of
> vector in kvm_arch_vcpu_load/put()
> Patch 3 implements the callback mechanism and fixes the context handling.
>
> Reason for this respin:
>
> put_cpu_vector_context may casue a volutary ctxswch. If we prematurely
> set RISCV_PREEMPT_V, the context restore path will rasise NEED_RESTORE
> for this kernel thread. As the result, any irq taken during the
> subsequence preempt_v would trigger a restore from the empty/stale
> context memory on the irq return path in riscv_v_context_nesting_end()
>
> The fix is summarized as below:
> --- a/arch/riscv/kernel/kernel_mode_vector.c
> +++ b/arch/riscv/kernel/kernel_mode_vector.c
> @@ -181,8 +181,8 @@ static int riscv_v_start_kernel_context(void)
>         /* Transfer the ownership of V from user to kernel, then save */
>         get_cpu_vector_context();
>         __riscv_flush_vector_context();
> -       riscv_v_start(RISCV_PREEMPT_V);
>         put_cpu_vector_context();
> +       riscv_v_start(RISCV_PREEMPT_V);
>         return 0;
>  }
>
> We will send a optimization patch that removes the costly riscv_v_is_on()
> for voluntary switch detection. A kselftest that stresses the vectorized
> user copy will also be included into that series.
>
> Patch summary:
>  - unchanged patch: 1, 2
>  - new patch: none
>  - modified patch: 3
>
> Changelog v5:
>  - add the r-b from Yong-Xuan
>  - fix a guest boot fail that hits ~1/100 in host kernel-mode vector
>  - Link to v4: https://lore.kernel.org/all/[email protected]/
>
> Changelog v4:
>  - Include a header to solve a mid-series build fail (patchwork ci)
>  - Drop preempt_v_started test in may_use_simd (Sashiko)
>  - Link to v3: https://lore.kernel.org/all/[email protected]/
>
> Changelog v3:
>  - Limit the export scope for {get,put}_cpu_vector_context()
>  - clears RISCV_V_VCPU_NEED_RESTORE flag in host restore to prevent
>    leaking
>  - consolidates guest vector restore at returning to guest to prevent
>    unnecessary save/restore between the preemptible window from
>    vcpu_load to vcpu_enter_exit
>  - Document flags added to riscv_v_flags
>  - Link to v2: https://lore.kernel.org/all/[email protected]/
>
> Changelog v2:
>  - Address issues pointed out by sashiko (2, 3)
>  - Link to v1: https://lore.kernel.org/all/[email protected]/
>
>
> Andy Chiu (3):
>   riscv: vector: refactor riscv_v_start_kernel_context
>   riscv: vector: allow non-preemptible kernel-mode vector with IRQs off
>   RISC-V: KVM: fix vcpu vector context handling for kernel-mode vector
>
>  arch/riscv/include/asm/kvm_vcpu_vector.h | 24 +++++++
>  arch/riscv/include/asm/processor.h       |  8 +++
>  arch/riscv/include/asm/simd.h            | 16 +----
>  arch/riscv/include/asm/vector.h          |  5 ++
>  arch/riscv/kernel/kernel_mode_vector.c   | 88 +++++++++++++++++-------
>  arch/riscv/kvm/main.c                    |  4 ++
>  arch/riscv/kvm/vcpu.c                    | 12 ++++
>  arch/riscv/kvm/vcpu_vector.c             | 22 +++++-
>  8 files changed, 139 insertions(+), 40 deletions(-)
>
> --
> 2.43.0

LGTM. I did not see any obvious issue on QEMU virt machine.

Reviewed-by: Anup Patel <[email protected]>

Queued this patch for Linux-7.3

Thanks,
Anup

-- 
kvm-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kvm-riscv
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.