[PATCH] riscv: KVM: Remove unnecessary vcpu kick
xiangwencheng
xiangwencheng at lanxincomputing.com
Thu Feb 20 00:17:33 PST 2025
> From: "Andrew Jones"<ajones at ventanamicro.com>
> Date: Thu, Feb 20, 2025, 16:01
> Subject: Re: [PATCH] riscv: KVM: Remove unnecessary vcpu kick
> To: "xiangwencheng"<xiangwencheng at lanxincomputing.com>
> Cc: "Radim Krčmář"<rkrcmar at ventanamicro.com>, <anup at brainfault.org>, <kvm-riscv at lists.infradead.org>, <kvm at vger.kernel.org>, <linux-riscv at lists.infradead.org>, <linux-kernel at vger.kernel.org>, <atishp at atishpatra.org>, <paul.walmsley at sifive.com>, <palmer at dabbelt.com>, <aou at eecs.berkeley.edu>, "linux-riscv"<linux-riscv-bounces at lists.infradead.org>
> On Thu, Feb 20, 2025 at 03:12:58PM +0800, xiangwencheng wrote:
> ...
> > As "KVM: WFI wake-up using IMSIC VS-files" that described in [1], writing to
> > VS-FILE will wake up vCPU.
> >
> > KVM has also handled the situation of WFI. Here is the WFI emulation process:
> > kvm_riscv_vcpu_exit
> > -> kvm_riscv_vcpu_virtual_insn
> > -> system_opcode_insn
> > -> wfi_insn
> > -> kvm_riscv_vcpu_wfi
> > -> kvm_vcpu_halt
> > -> kvm_vcpu_block
> > -> kvm_arch_vcpu_blocking
> > -> kvm_riscv_aia_wakeon_hgei
> > -> csr_set(CSR_HGEIE, BIT(hgei));
> > -> set_current_state(TASK_INTERRUPTIBLE);
> > -> schedule
> >
> > In kvm_arch_vcpu_blocking it will enable guest external interrupt, which
> > means wirting to VS_FILE will cause an interrupt. And the interrupt handler
> > hgei_interrupt which is setted in aia_hgei_init will finally call kvm_vcpu_kick
> > to wake up vCPU.
> >
> > So I still think is not necessary to call another kvm_vcpu_kick after writing to
> > VS_FILE.
> >
> > Waiting for more info. Thanks.
> >
> > [1] https://kvm-forum.qemu.org/2022/AIA_Virtualization_in_KVM_RISCV_final.pdf
> >
>
> Right, we don't need anything since hgei_interrupt() kicks for us, but if
> we do
>
> @@ -973,8 +973,8 @@ int kvm_riscv_vcpu_aia_imsic_inject(struct kvm_vcpu *vcpu,
> read_lock_irqsave(&imsic->vsfile_lock, flags);
>
> if (imsic->vsfile_cpu >= 0) {
> + kvm_vcpu_wake_up(vcpu);
> writel(iid, imsic->vsfile_va + IMSIC_MMIO_SETIPNUM_LE);
> - kvm_vcpu_kick(vcpu);
> } else {
> eix = &imsic->swfile->eix[iid / BITS_PER_TYPE(u64)];
> set_bit(iid & (BITS_PER_TYPE(u64) - 1), eix->eip);
>
> then we should be able to avoid taking a host interrupt.
But it may schedule again in the for(;;) loop of kvm_vcpu_block after kvm_vcpu_wake_up but
before the write of vsfile, and we will still get a host interrupt.
@@ -3573,6 +3573,8 @@ bool kvm_vcpu_block(struct kvm_vcpu *vcpu)
for (;;) {
set_current_state(TASK_INTERRUPTIBLE);
+ // Here will not break before the write of vsfile,
+ // and then we will schedule again.
if (kvm_vcpu_check_block(vcpu) < 0)
break;
waited = true;
schedule();
}
Thanks
>
> Thanks,
> drew
>
More information about the linux-riscv
mailing list