Skip to content

Commit

Permalink
x86/reboot: KVM: Disable SVM during reboot via virt/KVM reboot callback
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
sean-jc committed Aug 3, 2023
1 parent 119b5cb commit baeb4de
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 13 deletions.
8 changes: 0 additions & 8 deletions arch/x86/include/asm/virtext.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
3 changes: 0 additions & 3 deletions arch/x86/kernel/reboot.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
19 changes: 17 additions & 2 deletions arch/x86/kvm/svm/svm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand All @@ -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!
Expand All @@ -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)
Expand Down

0 comments on commit baeb4de

Please sign in to comment.