KVM: VMX: Fix interrupt loss during race with NMI
If an interrupt cannot be injected for some reason (say, page fault when fetching the IDT descriptor), the interrupt is marked for reinjection. However, if an NMI is queued at this time, the NMI will be injected instead and the NMI will be lost. Fix by deferring the NMI injection until the interrupt has been injected successfully. Analyzed by Jan Kiszka. Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
3eb77d5116
commit
bd2b3ca768
|
@ -3149,7 +3149,9 @@ static void vmx_intr_assist(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
if (cpu_has_virtual_nmis()) {
|
if (cpu_has_virtual_nmis()) {
|
||||||
if (vcpu->arch.nmi_pending && !vcpu->arch.nmi_injected) {
|
if (vcpu->arch.nmi_pending && !vcpu->arch.nmi_injected) {
|
||||||
if (vmx_nmi_enabled(vcpu)) {
|
if (vcpu->arch.interrupt.pending) {
|
||||||
|
enable_nmi_window(vcpu);
|
||||||
|
} else if (vmx_nmi_enabled(vcpu)) {
|
||||||
vcpu->arch.nmi_pending = false;
|
vcpu->arch.nmi_pending = false;
|
||||||
vcpu->arch.nmi_injected = true;
|
vcpu->arch.nmi_injected = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue