]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: VMX: Setup canonical VMCS config prior to kvm_x86_vendor_init()
authorSean Christopherson <seanjc@google.com>
Wed, 6 Aug 2025 19:56:36 +0000 (12:56 -0700)
committerSean Christopherson <seanjc@google.com>
Thu, 18 Sep 2025 19:56:28 +0000 (12:56 -0700)
Setup the golden VMCS config during vmx_init(), before the call to
kvm_x86_vendor_init(), instead of waiting until the callback to do
hardware setup.  setup_vmcs_config() only touches VMX state, i.e. doesn't
poke anything in kvm.ko, and has no runtime dependencies beyond
hv_init_evmcs().

Setting the VMCS config early on will allow referencing VMCS and VMX
capabilities at any point during setup, e.g. to check for PERF_GLOBAL_CTRL
save/load support during mediated PMU initialization.

Tested-by: Xudong Hao <xudong.hao@intel.com>
Link: https://lore.kernel.org/r/20250806195706.1650976-15-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/vmx/vmx.c

index a3f0d458be9d9276fefb24313a48c3b90291dc57..99be305555a71df188e6d4ba6cd52c9bf978f972 100644 (file)
@@ -8359,8 +8359,6 @@ __init int vmx_hardware_setup(void)
 
        vmx_setup_user_return_msrs();
 
-       if (setup_vmcs_config(&vmcs_config, &vmx_capability) < 0)
-               return -EIO;
 
        if (boot_cpu_has(X86_FEATURE_NX))
                kvm_enable_efer_bits(EFER_NX);
@@ -8584,11 +8582,18 @@ int __init vmx_init(void)
                return -EOPNOTSUPP;
 
        /*
-        * Note, hv_init_evmcs() touches only VMX knobs, i.e. there's nothing
-        * to unwind if a later step fails.
+        * Note, VMCS and eVMCS configuration only touch VMX knobs/variables,
+        * i.e. there's nothing to unwind if a later step fails.
         */
        hv_init_evmcs();
 
+       /*
+        * Parse the VMCS config and VMX capabilities before anything else, so
+        * that the information is available to all setup flows.
+        */
+       if (setup_vmcs_config(&vmcs_config, &vmx_capability) < 0)
+               return -EIO;
+
        r = kvm_x86_vendor_init(&vt_init_ops);
        if (r)
                return r;