[RFC PATCH v1 0/5] x86/boot, KVM: Move VMXON/VMXOFF handling from KVM to CPU lifecycle

Xin Li (Intel)
2025-09-09T18:31:05Z

There is now broad consensus that TDX should be decoupled from KVM. To
achieve this separation, it is necessary to move VMXON/VMXOFF handling
out of KVM. Sean has also discussed this approach in several TDX patch
series threads, e.g. [1], and has already done a round of refactoring
in KVM [2].

The simplest thing we could think of is to execute VMXON during the CPU
startup phase and VMXOFF during the CPU shutdown phase, even although
this leaves VMX on when it doesn't strictly need to be on.

This RFC series demonstrates the idea and seeks feedback from the KVM
community on its viability.

The benefits of doing VMXON/VMXOFF in the CPU startup/shutdown phase:

1) Eliminates in-flight VMXON/VMXOFF during CPU hotplug, system reboot,
or kexec while KVM is loading or unloading.

2) Removes the “insane dances” for handling unexpected VMXON/VMXOFF
execution, including the emergency reboot disable virtualization
mechanism and kvm_rebooting.

3) Allows KVM and other hypervisors on Linux to omit explicit VMX
enable/disable logic.

This RFC series follows the direction and does the following:

1) Move VMXON to the CPU startup phase instead of KVM initialization.

2) Move VMXOFF to the CPU shutdown phase instead of KVM teardown.

3) Move VMCLEAR of VMCSs to cpu_disable_virtualization().

4) Remove the emergency reboot disable virtualization mechanism.

5) Remove kvm_rebooting.

AMD SVM support is not included, as I do not have access to AMD hardware,
but adding it should be straightforward (currently broken in this RFC).

Note, the first two patches should ideally be merged into a single patch
to avoid breaking functionality in between. However, they are kept
separate in this RFC for clarity and easier review. I will merge them
if this approach proves viable.

[1] https://lore.kernel.org/lkml/ZhawUG0BduPVvVhN@google.com/
[2] https://lore.kernel.org/lkml/20240830043600.127750-1-seanjc@google.com/

Xin Li (Intel) (5):
x86/boot: Shift VMXON from KVM init to CPU startup phase
x86/boot: Move VMXOFF from KVM teardown to CPU shutdown phase
x86/shutdown, KVM: VMX: Move VMCLEAR of VMCSs to
cpu_disable_virtualization()
x86/reboot: Remove emergency_reboot_disable_virtualization()
KVM: Remove kvm_rebooting and its references

arch/x86/include/asm/kvm_host.h | 1 -
arch/x86/include/asm/processor.h | 3 +
arch/x86/include/asm/reboot.h | 11 --
arch/x86/include/asm/vmx.h | 5 +
arch/x86/kernel/cpu/common.c | 162 +++++++++++++++++++++++++++
arch/x86/kernel/crash.c | 5 +-
arch/x86/kernel/process.c | 3 +
arch/x86/kernel/reboot.c | 88 ++-------------
arch/x86/kernel/smp.c | 3 +-
arch/x86/kernel/smpboot.c | 6 +
arch/x86/kvm/svm/svm.c | 8 --
arch/x86/kvm/svm/vmenter.S | 42 +++----
arch/x86/kvm/vmx/main.c | 1 -
arch/x86/kvm/vmx/tdx.c | 4 +-
arch/x86/kvm/vmx/vmcs.h | 10 +-
arch/x86/kvm/vmx/vmenter.S | 2 -
arch/x86/kvm/vmx/vmx.c | 185 ++-----------------------------
arch/x86/kvm/x86.c | 18 +--
arch/x86/power/cpu.c | 10 +-
include/linux/kvm_host.h | 9 --
virt/kvm/kvm_main.c | 29 +----
21 files changed, 230 insertions(+), 375 deletions(-)

base-commit: 76eeb9b8de9880ca38696b2fb56ac45ac0a25c6c
--
2.51.0