On 30/01/19 01:59, Luwei Kang wrote: > Some Posted-Interrupts from passthrough devices may be lost or > overwritten when the vCPU is in runnable state. > > The SN (Suppress Notification) of PID (Posted Interrupt Descriptor) will > be set when the vCPU is preempted (vCPU in KVM_MP_STATE_RUNNABLE state > but not running on physical CPU). If a posted interrupt coming at this > time, the irq remmaping facility will set the bit of PIR (Posted > Interrupt Requests) without ON (Outstanding Notification). > So this interrupt can't be sync to APIC virtualization register and > will not be handled by Guest because ON is zero. > > Signed-off-by: Luwei Kang <luwei.kang@xxxxxxxxx> > --- > arch/x86/kvm/vmx/vmx.c | 2 +- > arch/x86/kvm/x86.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > index f6915f1..820a03b 100644 > --- a/arch/x86/kvm/vmx/vmx.c > +++ b/arch/x86/kvm/vmx/vmx.c > @@ -6048,7 +6048,7 @@ static int vmx_sync_pir_to_irr(struct kvm_vcpu *vcpu) > bool max_irr_updated; > > WARN_ON(!vcpu->arch.apicv_active); > - if (pi_test_on(&vmx->pi_desc)) { > + if (!bitmap_empty((unsigned long *)vmx->pi_desc.pir, NR_VECTORS)) { > pi_clear_on(&vmx->pi_desc); > /* > * IOMMU can write to PIR.ON, so the barrier matters even on UP. This is not what I asked. You should instead do the check after pi_clear_sn. Paolo > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 02c8e09..c31b608 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -7793,7 +7793,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) > * 1) We should set ->mode before checking ->requests. Please see > * the comment in kvm_vcpu_exiting_guest_mode(). > * > - * 2) For APICv, we should set ->mode before checking PIR.ON. This > + * 2) For APICv, we should set ->mode before checking PID.PIR. This > * pairs with the memory barrier implicit in pi_test_and_set_on > * (see vmx_deliver_posted_interrupt). > * >