summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJan Kiszka2014-03-07 20:03:14 +0100
committerPaolo Bonzini2014-03-11 08:41:46 +0100
commit220c56729766444f3dd823f740a147ca6d82c4c6 (patch)
tree9777e200c55a58c11afd8727a9b702fc843dd268 /arch
parentKVM: nVMX: Fully emulate preemption timer (diff)
downloadkernel-qcow2-linux-220c56729766444f3dd823f740a147ca6d82c4c6.tar.gz
kernel-qcow2-linux-220c56729766444f3dd823f740a147ca6d82c4c6.tar.xz
kernel-qcow2-linux-220c56729766444f3dd823f740a147ca6d82c4c6.zip
KVM: nVMX: Do not inject NMI vmexits when L2 has a pending interrupt
According to SDM 27.2.3, IDT vectoring information will not be valid on vmexits caused by external NMIs. So we have to avoid creating such scenarios by delaying EXIT_REASON_EXCEPTION_NMI injection as long as we have a pending interrupt because that one would be migrated to L1's IDT vectoring info on nested exit. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kvm/vmx.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index e559675e113f..2c9d21e2d033 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -8176,7 +8176,8 @@ static int vmx_check_nested_events(struct kvm_vcpu *vcpu, bool external_intr)
}
if (vcpu->arch.nmi_pending && nested_exit_on_nmi(vcpu)) {
- if (vmx->nested.nested_run_pending)
+ if (vmx->nested.nested_run_pending ||
+ vcpu->arch.interrupt.pending)
return -EBUSY;
nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI,
NMI_VECTOR | INTR_TYPE_NMI_INTR |