summaryrefslogtreecommitdiffstats
path: root/arch/x86/include/asm
diff options
context:
space:
mode:
authorAvi Kivity2011-09-20 12:43:14 +0200
committerAvi Kivity2011-09-25 18:52:59 +0200
commit7460fb4a340033107530df19e7e125bd0969bfb2 (patch)
tree02f2aedd48af0a2e316b28d6a5b21a7a96442ac6 /arch/x86/include/asm
parentKVM: x86 emulator: convert push %sreg/pop %sreg to direct decode (diff)
downloadkernel-qcow2-linux-7460fb4a340033107530df19e7e125bd0969bfb2.tar.gz
kernel-qcow2-linux-7460fb4a340033107530df19e7e125bd0969bfb2.tar.xz
kernel-qcow2-linux-7460fb4a340033107530df19e7e125bd0969bfb2.zip
KVM: Fix simultaneous NMIs
If simultaneous NMIs happen, we're supposed to queue the second and next (collapsing them), but currently we sometimes collapse the second into the first. Fix by using a counter for pending NMIs instead of a bool; since the counter limit depends on whether the processor is currently in an NMI handler, which can only be checked in vcpu context (via the NMI mask), we add a new KVM_REQ_NMI to request recalculation of the counter. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/include/asm')
-rw-r--r--arch/x86/include/asm/kvm_host.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 6ab4241c27cb..ab62711ccb78 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -413,8 +413,9 @@ struct kvm_vcpu_arch {
u32 tsc_catchup_mult;
s8 tsc_catchup_shift;
- bool nmi_pending;
- bool nmi_injected;
+ atomic_t nmi_queued; /* unprocessed asynchronous NMIs */
+ unsigned nmi_pending; /* NMI queued after currently running handler */
+ bool nmi_injected; /* Trying to inject an NMI this entry */
struct mtrr_state_type mtrr_state;
u32 pat;