On 2024-03-28 at 11:12:57 +0800, Chao Gao wrote: > >+#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? > I think so. We happended to encounter the following error and breaks the boot up: "SEAMCALL (0x000000000000000f) failed: 0xc0000b0800000001" 0xc0000b0800000001 indicates the TDX_TLB_TRACKING_NOT_DONE, and it is caused by page demotion but not yet doing a tlb shotdown by tlb track. It was found on my system the CONFIG_HYPERV is not set, and it makes kvm_arch_flush_remote_tlbs() not invoking tdx_track() before the tdh_mem_page_demote(), which caused the problem. > 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 If the flush_remote_tlbs implementation are both available in HYPERV and TDX, does it make sense to remove the config checks? I thought when commit 0277022a77a5 was introduced, the only user of flush_remote_tlbs() is hyperv, and now there is TDX. thanks, Chenyu