On Fri, 2021-10-08 at 19:12 -0700, Sean Christopherson wrote:
> Signal the AVIC doorbell iff the vCPU is running in the guest.  If the vCPU
> is not IN_GUEST_MODE, it's guaranteed to pick up any pending IRQs on the
> next VMRUN, which unconditionally processes the vIRR.
> 
> Add comments to document the logic.
> 
> Signed-off-by: Sean Christopherson <[email protected]>
> ---
>  arch/x86/kvm/svm/avic.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c
> index 208c5c71e827..cbf02e7e20d0 100644
> --- a/arch/x86/kvm/svm/avic.c
> +++ b/arch/x86/kvm/svm/avic.c
> @@ -674,7 +674,12 @@ int svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec)
>       kvm_lapic_set_irr(vec, vcpu->arch.apic);
>       smp_mb__after_atomic();
>  
> -     if (avic_vcpu_is_running(vcpu)) {
> +     /*
> +      * Signal the doorbell to tell hardware to inject the IRQ if the vCPU
> +      * is in the guest.  If the vCPU is not in the guest, hardware will
> +      * automatically process AVIC interrupts at VMRUN.
> +      */
> +     if (vcpu->mode == IN_GUEST_MODE) {
>               int cpu = READ_ONCE(vcpu->cpu);
>  
>               /*
> @@ -687,8 +692,13 @@ int svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec)
>               if (cpu != get_cpu())
>                       wrmsrl(SVM_AVIC_DOORBELL, kvm_cpu_get_apicid(cpu));
>               put_cpu();
> -     } else
> +     } else {
> +             /*
> +              * Wake the vCPU if it was blocking.  KVM will then detect the
> +              * pending IRQ when checking if the vCPU has a wake event.
> +              */
>               kvm_vcpu_wake_up(vcpu);
> +     }
>  
>       return 0;
>  }

It makes sense indeed to avoid ringing the doorbell when the vCPU is not in the 
guest mode.

I do wonder if we want to call kvm_vcpu_wake_up always otherwise, as the vCPU 
might
be just outside of the guest mode and not scheduled out. I don't know how 
expensive
is kvm_vcpu_wake_up in this case.

Before this patch, the avic_vcpu_is_running would only be false when the vCPU 
is scheduled out
(e.g when vcpu_put was done on it)

Best regards,
        Maxim Levitsky

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to