>+#if IS_ENABLED(CONFIG_HYPERV) >+static int vt_flush_remote_tlbs(struct kvm *kvm); >+#endif >+ > static __init int vt_hardware_setup(void) > { > int ret; >@@ -49,11 +53,29 @@ static __init int vt_hardware_setup(void) > pr_warn_ratelimited("TDX requires mmio caching. Please enable mmio caching for TDX.\n"); > } > >+#if IS_ENABLED(CONFIG_HYPERV) >+ /* >+ * TDX KVM overrides flush_remote_tlbs method and assumes >+ * flush_remote_tlbs_range = NULL that falls back to >+ * flush_remote_tlbs. Disable TDX if there are conflicts. >+ */ >+ if (vt_x86_ops.flush_remote_tlbs || >+ vt_x86_ops.flush_remote_tlbs_range) { >+ enable_tdx = false; >+ pr_warn_ratelimited("TDX requires baremetal. Not Supported on VMM guest.\n"); >+ } >+#endif >+ > enable_tdx = enable_tdx && !tdx_hardware_setup(&vt_x86_ops); > if (enable_tdx) > vt_x86_ops.vm_size = max_t(unsigned int, vt_x86_ops.vm_size, > sizeof(struct kvm_tdx)); > >+#if IS_ENABLED(CONFIG_HYPERV) >+ if (enable_tdx) >+ vt_x86_ops.flush_remote_tlbs = vt_flush_remote_tlbs; Is this hook necessary/beneficial to TDX? if no, we can leave .flush_remote_tlbs as NULL. if yes, we should do: struct kvm_x86_ops { ... #if IS_ENABLED(CONFIG_HYPERV) || IS_ENABLED(TDX...) int (*flush_remote_tlbs)(struct kvm *kvm); int (*flush_remote_tlbs_range)(struct kvm *kvm, gfn_t gfn, gfn_t nr_pages); #endif