]> git.baikalelectronics.ru Git - kernel.git/commit
X86/VMX: Disable VMX preemption timer if MWAIT is not intercepted
authorKarimAllah Ahmed <karahmed@amazon.de>
Tue, 10 Apr 2018 12:15:46 +0000 (14:15 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 10 Apr 2018 15:19:44 +0000 (17:19 +0200)
commit5fab8960736a7d92eeedff15341d2c5584c3da32
tree6544b98c691fa8ce69940a6d03bebb3badaa120b
parentad6d5de247ce282858504ef4162f195f146e3732
X86/VMX: Disable VMX preemption timer if MWAIT is not intercepted

The VMX-preemption timer is used by KVM as a way to set deadlines for the
guest (i.e. timer emulation). That was safe till very recently when
capability KVM_X86_DISABLE_EXITS_MWAIT to disable intercepting MWAIT was
introduced. According to Intel SDM 25.5.1:

"""
The VMX-preemption timer operates in the C-states C0, C1, and C2; it also
operates in the shutdown and wait-for-SIPI states. If the timer counts down
to zero in any state other than the wait-for SIPI state, the logical
processor transitions to the C0 C-state and causes a VM exit; the timer
does not cause a VM exit if it counts down to zero in the wait-for-SIPI
state. The timer is not decremented in C-states deeper than C2.
"""

Now once the guest issues the MWAIT with a c-state deeper than
C2 the preemption timer will never wake it up again since it stopped
ticking! Usually this is compensated by other activities in the system that
would wake the core from the deep C-state (and cause a VMExit). For
example, if the host itself is ticking or it received interrupts, etc!

So disable the VMX-preemption timer if MWAIT is exposed to the guest!

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Cc: kvm@vger.kernel.org
Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de>
Fixes: a69cc6b81959d5e7d885e85c8297ea1f27148f88
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx.c