x86/reboot: KVM: Disable SVM during reboot via virt/KVM reboot callback

Use the virt callback to disable SVM (and set GIF=1) during an emergency
instead of blindly attempting to disable SVM.  Like the VMX case, if a
hypervisor, i.e. KVM, isn't loaded/active, SVM can't be in use.

Acked-by: Kai Huang <kai.huang@intel.com>
Link: https://lore.kernel.org/r/20230721201859.2307736-5-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
Sean Christopherson 2023-07-21 13:18:44 -07:00
parent 119b5cb4ff
commit baeb4de7ad
3 changed files with 17 additions and 13 deletions

View File

@ -133,12 +133,4 @@ static inline void cpu_svm_disable(void)
}
}
/** Makes sure SVM is disabled, if it is supported on the CPU
*/
static inline void cpu_emergency_svm_disable(void)
{
if (cpu_has_svm(NULL))
cpu_svm_disable();
}
#endif /* _ASM_X86_VIRTEX_H */

View File

@ -826,9 +826,6 @@ void cpu_emergency_disable_virtualization(void)
if (callback)
callback();
rcu_read_unlock();
/* KVM_AMD doesn't yet utilize the common callback. */
cpu_emergency_svm_disable();
}
#if defined(CONFIG_SMP)

View File

@ -39,6 +39,7 @@
#include <asm/spec-ctrl.h>
#include <asm/cpu_device_id.h>
#include <asm/traps.h>
#include <asm/reboot.h>
#include <asm/fpu/api.h>
#include <asm/virtext.h>
@ -563,6 +564,11 @@ void __svm_write_tsc_multiplier(u64 multiplier)
preempt_enable();
}
static void svm_emergency_disable(void)
{
cpu_svm_disable();
}
static void svm_hardware_disable(void)
{
/* Make sure we clean up behind us */
@ -5209,6 +5215,13 @@ static struct kvm_x86_init_ops svm_init_ops __initdata = {
.pmu_ops = &amd_pmu_ops,
};
static void __svm_exit(void)
{
kvm_x86_vendor_exit();
cpu_emergency_unregister_virt_callback(svm_emergency_disable);
}
static int __init svm_init(void)
{
int r;
@ -5222,6 +5235,8 @@ static int __init svm_init(void)
if (r)
return r;
cpu_emergency_register_virt_callback(svm_emergency_disable);
/*
* Common KVM initialization _must_ come last, after this, /dev/kvm is
* exposed to userspace!
@ -5234,14 +5249,14 @@ static int __init svm_init(void)
return 0;
err_kvm_init:
kvm_x86_vendor_exit();
__svm_exit();
return r;
}
static void __exit svm_exit(void)
{
kvm_exit();
kvm_x86_vendor_exit();
__svm_exit();
}
module_init(svm_init)