KVM: VMX: Use the kernel's version of VMXOFF
authorSean Christopherson <seanjc@google.com>
Thu, 31 Dec 2020 00:26:59 +0000 (16:26 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 4 Feb 2021 10:27:33 +0000 (05:27 -0500)
Drop kvm_cpu_vmxoff() in favor of the kernel's cpu_vmxoff().  Modify the
latter to return -EIO on fault so that KVM can invoke
kvm_spurious_fault() when appropriate.  In addition to the obvious code
reuse, dropping kvm_cpu_vmxoff() also eliminates VMX's last usage of the
__ex()/__kvm_handle_fault_on_reboot() macros, thus helping pave the way
toward dropping them entirely.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20201231002702.2223707-7-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/virtext.h
arch/x86/kvm/vmx/vmx.c

index 2cc5854..8757078 100644 (file)
@@ -41,13 +41,18 @@ static inline int cpu_has_vmx(void)
  * faults are guaranteed to be due to the !post-VMXON check unless the CPU is
  * magically in RM, VM86, compat mode, or at CPL>0.
  */
-static inline void cpu_vmxoff(void)
+static inline int cpu_vmxoff(void)
 {
        asm_volatile_goto("1: vmxoff\n\t"
                          _ASM_EXTABLE(1b, %l[fault])
                          ::: "cc", "memory" : fault);
+
+       cr4_clear_bits(X86_CR4_VMXE);
+       return 0;
+
 fault:
        cr4_clear_bits(X86_CR4_VMXE);
+       return -EIO;
 }
 
 static inline int cpu_vmx_enabled(void)
index 55ae56c..02949a6 100644 (file)
@@ -2369,21 +2369,12 @@ static void vmclear_local_loaded_vmcss(void)
                __loaded_vmcs_clear(v);
 }
 
-
-/* Just like cpu_vmxoff(), but with the __kvm_handle_fault_on_reboot()
- * tricks.
- */
-static void kvm_cpu_vmxoff(void)
-{
-       asm volatile (__ex("vmxoff"));
-
-       cr4_clear_bits(X86_CR4_VMXE);
-}
-
 static void hardware_disable(void)
 {
        vmclear_local_loaded_vmcss();
-       kvm_cpu_vmxoff();
+
+       if (cpu_vmxoff())
+               kvm_spurious_fault();
 
        intel_pt_handle_vmx(0);
 }