Commit baeb4de7 authored by Sean Christopherson's avatar Sean Christopherson
Browse files

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: default avatarKai Huang <kai.huang@intel.com>
Link: https://lore.kernel.org/r/20230721201859.2307736-5-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent 119b5cb4
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -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 */
+0 −3
Original line number Diff line number Diff line
@@ -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)
+17 −2
Original line number Diff line number Diff line
@@ -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)