On Tue, Jul 12, 2022, Peter Xu wrote: > On Fri, Jun 24, 2022 at 11:27:33PM +0000, Sean Christopherson wrote: > > @@ -11937,6 +11932,10 @@ int kvm_arch_hardware_setup(void *opaque) > > > > kvm_ops_update(ops); > > > > + r = kvm_mmu_hardware_setup(); > > + if (r) > > + goto out_unsetup; > > + > > kvm_register_perf_callbacks(ops->handle_intel_pt_intr); > > > > if (!kvm_cpu_cap_has(X86_FEATURE_XSAVES)) > > @@ -11960,12 +11959,18 @@ int kvm_arch_hardware_setup(void *opaque) > > kvm_caps.default_tsc_scaling_ratio = 1ULL << kvm_caps.tsc_scaling_ratio_frac_bits; > > kvm_init_msr_list(); > > return 0; > > + > > +out_unsetup: > > + static_call(kvm_x86_hardware_unsetup)(); > > Should this be kvm_mmu_hardware_unsetup()? Or did I miss something?.. There is no kvm_mmu_hardware_unsetup(). This path is called if kvm_mmu_hardware_setup() fails, i.e. the common code doesn't need to unwind anything. The vendor call is not shown in the patch diff, but it's before this as: r = ops->hardware_setup(); if (r != 0) return r there's no existing error paths after that runs, which is why the vendor unsetup call is new.