KVM: x86: Recompute PID.ON when clearing PID.SN
authorLuwei Kang <luwei.kang@intel.com>
Thu, 14 Feb 2019 02:48:07 +0000 (10:48 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 14 Feb 2019 15:20:31 +0000 (16:20 +0100)
commitc112b5f50232a257056903040c66d97efb536889
treec5bc25f2dd083b9d8ec9eaea199a56e225ccb0b9
parent08e16754cad2298f8cb58bd0f99e658da54c327d
KVM: x86: Recompute PID.ON when clearing PID.SN

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 comes at this time,
the irq remapping facility will set the bit of PIR (Posted Interrupt
Requests) but not ON (Outstanding Notification).  Then, the interrupt
will not be seen by KVM, which always expects PID.ON=1 if PID.PIR=1
as documented in the Intel processor SDM but not in the VT-d specification.
To fix this, restore the invariant after PID.SN is cleared.

Signed-off-by: Luwei Kang <luwei.kang@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/vmx/vmx.h
arch/x86/kvm/x86.c