On 23/04/20 11:01, Wanpeng Li wrote: > +static void fast_deliver_interrupt(struct kvm_lapic *apic, int vector) > +{ > + struct kvm_vcpu *vcpu = apic->vcpu; > + > + kvm_lapic_clear_vector(vector, apic->regs + APIC_TMR); > + > + if (vcpu->arch.apicv_active) { > + if (kvm_x86_ops.pi_test_and_set_pir_on(vcpu, vector)) > + return; > + > + kvm_x86_ops.sync_pir_to_irr(vcpu); > + } else { > + kvm_lapic_set_irr(vector, apic); > + if (kvm_cpu_has_injectable_intr(vcpu)) { > + if (kvm_x86_ops.interrupt_allowed(vcpu)) { > + kvm_queue_interrupt(vcpu, > + kvm_cpu_get_interrupt(vcpu), false); > + kvm_x86_ops.set_irq(vcpu); > + } else > + kvm_x86_ops.enable_irq_window(vcpu); > + } > + } > +} > + Ok, got it now. The problem is that deliver_posted_interrupt goes through if (!kvm_vcpu_trigger_posted_interrupt(vcpu, false)) kvm_vcpu_kick(vcpu); Would it help to make the above if (vcpu != kvm_get_running_vcpu() && !kvm_vcpu_trigger_posted_interrupt(vcpu, false)) kvm_vcpu_kick(vcpu); ? If that is enough for the APICv case, it's good enough. Paolo