Oren, On 3/11/19 6:38 PM, Suthikulpanit, Suravee wrote: > However, looking a bit more closely, I notice the logic in svm_deliver_avic_intr() > should also have been changed from kvm_vcpu_wake_up() to kvm_vcpu_kick() > since the latter will result in clearing the IRR bit for the IPI vector > when trying to send IPI as part of the following call path. > > vcpu_enter_guest() > |-- inject_pending_event() > |-- kvm_cpu_get_interrupt() > |-- kvm_get_apic_interrupt() > |-- apic_clear_irr() > |-- apic_set_isr() > |-- apic_update_ppr() .... > > Please see the patch below. > > Not sure if this would address the problem you are seeing. > > Thanks, > Suravee > > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c > index 24dfa6a93711..d2841c3dbc04 100644 > --- a/arch/x86/kvm/svm.c > +++ b/arch/x86/kvm/svm.c > @@ -5219,11 +5256,13 @@ static void 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)) > + if (avic_vcpu_is_running(vcpu)) { > wrmsrl(SVM_AVIC_DOORBELL, > kvm_cpu_get_apicid(vcpu->cpu)); > - else > - kvm_vcpu_wake_up(vcpu); > + } else { > + kvm_make_request(KVM_REQ_EVENT, vcpu); > + kvm_vcpu_kick(vcpu); > + } > } > > static void svm_ir_list_del(struct vcpu_svm *svm, struct amd_iommu_pi_data *pi) Please ignore the part mentioned above. The current implementation should already be fine. Suravee