• KarimAllah Ahmed's avatar
    X86/VMX: Disable VMX preemption timer if MWAIT is not intercepted · 386c6ddb
    KarimAllah Ahmed authored
    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: default avatarKarimAllah Ahmed <karahmed@amazon.de>
    Fixes: 4d5422ceSigned-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    386c6ddb
vmx.c 361 KB