All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sagi Shahar <sagis@google.com>
To: isaku.yamahata@intel.com
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	isaku.yamahata@gmail.com, Paolo Bonzini <pbonzini@redhat.com>,
	erdemaktas@google.com, Sean Christopherson <seanjc@google.com>,
	David Matlack <dmatlack@google.com>,
	Sean Christopherson <sean.j.christopherson@intel.com>,
	Kai Huang <kai.huang@intel.com>
Subject: Re: [PATCH v10 016/108] KVM: TDX: create/destroy VM structure
Date: Mon, 14 Nov 2022 16:06:10 -0800	[thread overview]
Message-ID: <CAAhR5DFGvGQmf95hrGcK0uvawvFrzdCisnEtvLV8k8pM3FRV_w@mail.gmail.com> (raw)
In-Reply-To: <fb337a67e17715977e46523d1344cb2a7f46a37a.1667110240.git.isaku.yamahata@intel.com>

On Sat, Oct 29, 2022 at 11:24 PM <isaku.yamahata@intel.com> wrote:
>
> From: Sean Christopherson <sean.j.christopherson@intel.com>
>
> As the first step to create TDX guest, create/destroy VM struct.  Assign
> TDX private Host Key ID (HKID) to the TDX guest for memory encryption and
> allocate extra pages for the TDX guest. On destruction, free allocated
> pages, and HKID.
>
> Before tearing down private page tables, TDX requires some resources of the
> guest TD to be destroyed (i.e. keyID must have been reclaimed, etc).  Add
> flush_shadow_all_private callback before tearing down private page tables
> for it.
>
> Add a second kvm_x86_ops hook in kvm_arch_destroy_vm() to support TDX's
> destruction path, which needs to first put the VM into a teardown state,
> then free per-vCPU resources, and finally free per-VM resources.
>
> Co-developed-by: Kai Huang <kai.huang@intel.com>
> Signed-off-by: Kai Huang <kai.huang@intel.com>
> Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
> ---
>  arch/x86/include/asm/kvm-x86-ops.h |   2 +
>  arch/x86/include/asm/kvm_host.h    |   2 +
>  arch/x86/kvm/vmx/main.c            |  34 ++-
>  arch/x86/kvm/vmx/tdx.c             | 411 +++++++++++++++++++++++++++++
>  arch/x86/kvm/vmx/tdx.h             |   2 +
>  arch/x86/kvm/vmx/x86_ops.h         |  11 +
>  arch/x86/kvm/x86.c                 |   8 +
>  7 files changed, 467 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm-x86-ops.h b/arch/x86/include/asm/kvm-x86-ops.h
> index 8a5c5ae70bc5..3a29a6b31ee8 100644
> --- a/arch/x86/include/asm/kvm-x86-ops.h
> +++ b/arch/x86/include/asm/kvm-x86-ops.h
> @@ -21,7 +21,9 @@ KVM_X86_OP(has_emulated_msr)
>  KVM_X86_OP(vcpu_after_set_cpuid)
>  KVM_X86_OP(is_vm_type_supported)
>  KVM_X86_OP(vm_init)
> +KVM_X86_OP_OPTIONAL(flush_shadow_all_private)
>  KVM_X86_OP_OPTIONAL(vm_destroy)
> +KVM_X86_OP_OPTIONAL(vm_free)
>  KVM_X86_OP_OPTIONAL_RET0(vcpu_precreate)
>  KVM_X86_OP(vcpu_create)
>  KVM_X86_OP(vcpu_free)
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 2a41a93a80f3..2870155ce6fb 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -1472,7 +1472,9 @@ struct kvm_x86_ops {
>         bool (*is_vm_type_supported)(unsigned long vm_type);
>         unsigned int vm_size;
>         int (*vm_init)(struct kvm *kvm);
> +       void (*flush_shadow_all_private)(struct kvm *kvm);
>         void (*vm_destroy)(struct kvm *kvm);
> +       void (*vm_free)(struct kvm *kvm);
>
>         /* Create, but do not attach this VCPU */
>         int (*vcpu_precreate)(struct kvm *kvm);
> diff --git a/arch/x86/kvm/vmx/main.c b/arch/x86/kvm/vmx/main.c
> index 0900ff2f2390..d01a946a18cf 100644
> --- a/arch/x86/kvm/vmx/main.c
> +++ b/arch/x86/kvm/vmx/main.c
> @@ -29,18 +29,44 @@ static __init int vt_hardware_setup(void)
>         return 0;
>  }
>
> +static void vt_hardware_unsetup(void)
> +{
> +       tdx_hardware_unsetup();
> +       vmx_hardware_unsetup();
> +}
> +
>  static int vt_vm_init(struct kvm *kvm)
>  {
>         if (is_td(kvm))
> -               return -EOPNOTSUPP;     /* Not ready to create guest TD yet. */
> +               return tdx_vm_init(kvm);
>
>         return vmx_vm_init(kvm);
>  }
>
> +static void vt_flush_shadow_all_private(struct kvm *kvm)
> +{
> +       if (is_td(kvm))
> +               return tdx_mmu_release_hkid(kvm);
> +}
> +
> +static void vt_vm_destroy(struct kvm *kvm)
> +{
> +       if (is_td(kvm))
> +               return;
> +
> +       vmx_vm_destroy(kvm);
> +}
> +
> +static void vt_vm_free(struct kvm *kvm)
> +{
> +       if (is_td(kvm))
> +               return tdx_vm_free(kvm);
> +}
> +
>  struct kvm_x86_ops vt_x86_ops __initdata = {
>         .name = "kvm_intel",
>
> -       .hardware_unsetup = vmx_hardware_unsetup,
> +       .hardware_unsetup = vt_hardware_unsetup,
>         .check_processor_compatibility = vmx_check_processor_compatibility,
>
>         .hardware_enable = vmx_hardware_enable,
> @@ -50,7 +76,9 @@ struct kvm_x86_ops vt_x86_ops __initdata = {
>         .is_vm_type_supported = vt_is_vm_type_supported,
>         .vm_size = sizeof(struct kvm_vmx),
>         .vm_init = vt_vm_init,
> -       .vm_destroy = vmx_vm_destroy,
> +       .flush_shadow_all_private = vt_flush_shadow_all_private,
> +       .vm_destroy = vt_vm_destroy,
> +       .vm_free = vt_vm_free,
>
>         .vcpu_precreate = vmx_vcpu_precreate,
>         .vcpu_create = vmx_vcpu_create,
> diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
> index 530e72f85762..ec88dde0d300 100644
> --- a/arch/x86/kvm/vmx/tdx.c
> +++ b/arch/x86/kvm/vmx/tdx.c
> @@ -32,6 +32,401 @@ struct tdx_capabilities {
>  /* Capabilities of KVM + the TDX module. */
>  static struct tdx_capabilities tdx_caps;
>
> +/*
> + * Some TDX SEAMCALLs (TDH.MNG.CREATE, TDH.PHYMEM.CACHE.WB,
> + * TDH.MNG.KEY.RECLAIMID, TDH.MNG.KEY.FREEID etc) tries to acquire a global lock
> + * internally in TDX module.  If failed, TDX_OPERAND_BUSY is returned without
> + * spinning or waiting due to a constraint on execution time.  It's caller's
> + * responsibility to avoid race (or retry on TDX_OPERAND_BUSY).  Use this mutex
> + * to avoid race in TDX module because the kernel knows better about scheduling.
> + */
> +static DEFINE_MUTEX(tdx_lock);
> +static struct mutex *tdx_mng_key_config_lock;
> +
> +static __always_inline hpa_t set_hkid_to_hpa(hpa_t pa, u16 hkid)
> +{
> +       return pa | ((hpa_t)hkid << boot_cpu_data.x86_phys_bits);
> +}
> +
> +static inline bool is_td_created(struct kvm_tdx *kvm_tdx)
> +{
> +       return kvm_tdx->tdr.added;
> +}
> +
> +static inline void tdx_hkid_free(struct kvm_tdx *kvm_tdx)
> +{
> +       tdx_keyid_free(kvm_tdx->hkid);
> +       kvm_tdx->hkid = -1;
> +}
> +
> +static inline bool is_hkid_assigned(struct kvm_tdx *kvm_tdx)
> +{
> +       return kvm_tdx->hkid > 0;
> +}
> +
> +static void tdx_clear_page(unsigned long page)
> +{
> +       const void *zero_page = (const void *) __va(page_to_phys(ZERO_PAGE(0)));
> +       unsigned long i;
> +
> +       /*
> +        * Zeroing the page is only necessary for systems with MKTME-i:
> +        * when re-assign one page from old keyid to a new keyid, MOVDIR64B is
> +        * required to clear/write the page with new keyid to prevent integrity
> +        * error when read on the page with new keyid.
> +        *
> +        * The cache line could be poisoned (even without MKTME-i), clear the
> +        * poison bit.
> +        */
> +       for (i = 0; i < PAGE_SIZE; i += 64)
> +               movdir64b((void *)(page + i), zero_page);
> +       /*
> +        * MOVDIR64B store uses WC buffer.  Prevent following memory reads
> +        * from seeing potentially poisoned cache.
> +        */
> +       __mb();
> +}
> +
> +static int tdx_reclaim_page(unsigned long va, hpa_t pa, bool do_wb, u16 hkid)
> +{
> +       struct tdx_module_output out;
> +       u64 err;
> +
> +       do {
> +               err = tdh_phymem_page_reclaim(pa, &out);
> +               /*
> +                * TDH.PHYMEM.PAGE.RECLAIM is allowed only when TD is shutdown.
> +                * state.  i.e. destructing TD.
> +                * TDH.PHYMEM.PAGE.RECLAIM  requires TDR and target page.
> +                * Because we're destructing TD, it's rare to contend with TDR.
> +                */
> +       } while (err == (TDX_OPERAND_BUSY | TDX_OPERAND_ID_RCX));
> +       if (WARN_ON_ONCE(err)) {
> +               pr_tdx_error(TDH_PHYMEM_PAGE_RECLAIM, err, &out);
> +               return -EIO;
> +       }
> +
> +       if (do_wb) {
> +               /*
> +                * Only TDR page gets into this path.  No contention is expected
> +                * because the last page of TD.
> +                */
> +               err = tdh_phymem_page_wbinvd(set_hkid_to_hpa(pa, hkid));
> +               if (WARN_ON_ONCE(err)) {
> +                       pr_tdx_error(TDH_PHYMEM_PAGE_WBINVD, err, NULL);
> +                       return -EIO;
> +               }
> +       }
> +
> +       tdx_clear_page(va);
> +       return 0;
> +}
> +
> +static int tdx_alloc_td_page(struct tdx_td_page *page)
> +{
> +       page->va = __get_free_page(GFP_KERNEL_ACCOUNT);
> +       if (!page->va)
> +               return -ENOMEM;
> +
> +       page->pa = __pa(page->va);
> +       return 0;
> +}
> +
> +static inline void tdx_mark_td_page_added(struct tdx_td_page *page)
> +{
> +       WARN_ON_ONCE(page->added);
> +       page->added = true;
> +}
> +
> +static void tdx_reclaim_td_page(struct tdx_td_page *page)
> +{
> +       if (page->added) {
> +               /*
> +                * TDCX are being reclaimed.  TDX module maps TDCX with HKID
> +                * assigned to the TD.  Here the cache associated to the TD
> +                * was already flushed by TDH.PHYMEM.CACHE.WB before here, So
> +                * cache doesn't need to be flushed again.
> +                */
> +               if (tdx_reclaim_page(page->va, page->pa, false, 0))
> +                       return;
> +
> +               page->added = false;
> +       }
> +       if (page->va) {
> +               free_page(page->va);
> +               page->va = 0;
> +       }
> +}
> +
> +static int tdx_do_tdh_phymem_cache_wb(void *param)
> +{
> +       u64 err = 0;
> +
> +       do {
> +               err = tdh_phymem_cache_wb(!!err);
> +       } while (err == TDX_INTERRUPTED_RESUMABLE);
> +
> +       /* Other thread may have done for us. */
> +       if (err == TDX_NO_HKID_READY_TO_WBCACHE)
> +               err = TDX_SUCCESS;
> +       if (WARN_ON_ONCE(err)) {
> +               pr_tdx_error(TDH_PHYMEM_CACHE_WB, err, NULL);
> +               return -EIO;
> +       }
> +
> +       return 0;
> +}
> +
> +void tdx_mmu_release_hkid(struct kvm *kvm)
> +{
> +       struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
> +       cpumask_var_t packages;
> +       bool cpumask_allocated;
> +       u64 err;
> +       int ret;
> +       int i;
> +
> +       if (!is_hkid_assigned(kvm_tdx))
> +               return;
> +
> +       if (!is_td_created(kvm_tdx))
> +               goto free_hkid;
> +
> +       cpumask_allocated = zalloc_cpumask_var(&packages, GFP_KERNEL);
> +       cpus_read_lock();
> +       for_each_online_cpu(i) {
> +               if (cpumask_allocated &&
> +                       cpumask_test_and_set_cpu(topology_physical_package_id(i),
> +                                               packages))
> +                       continue;
> +
> +               /*
> +                * We can destroy multiple the guest TDs simultaneously.
> +                * Prevent tdh_phymem_cache_wb from returning TDX_BUSY by
> +                * serialization.
> +                */
> +               mutex_lock(&tdx_lock);
> +               ret = smp_call_on_cpu(i, tdx_do_tdh_phymem_cache_wb, NULL, 1);
> +               mutex_unlock(&tdx_lock);
> +               if (ret)
> +                       break;
> +       }
> +       cpus_read_unlock();
> +       free_cpumask_var(packages);
> +
> +       mutex_lock(&tdx_lock);
> +       err = tdh_mng_key_freeid(kvm_tdx->tdr.pa);
> +       mutex_unlock(&tdx_lock);
> +       if (WARN_ON_ONCE(err)) {
> +               pr_tdx_error(TDH_MNG_KEY_FREEID, err, NULL);
> +               pr_err("tdh_mng_key_freeid failed. HKID %d is leaked.\n",
> +                       kvm_tdx->hkid);
> +               return;
> +       }
> +
> +free_hkid:
> +       tdx_hkid_free(kvm_tdx);
> +}
> +
> +void tdx_vm_free(struct kvm *kvm)
> +{
> +       struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
> +       int i;
> +
> +       /* Can't reclaim or free TD pages if teardown failed. */
> +       if (is_hkid_assigned(kvm_tdx))
> +               return;
> +
> +       if (kvm_tdx->tdcs) {
> +               for (i = 0; i < tdx_caps.tdcs_nr_pages; i++)
> +                       tdx_reclaim_td_page(&kvm_tdx->tdcs[i]);
> +               kfree(kvm_tdx->tdcs);
> +       }
> +
> +       /*
> +        * TDX module maps TDR with TDX global HKID.  TDX module may access TDR
> +        * while operating on TD (Especially reclaiming TDCS).  Cache flush with
> +        * TDX global HKID is needed.
> +        */
> +       if (kvm_tdx->tdr.added &&
> +               tdx_reclaim_page(kvm_tdx->tdr.va, kvm_tdx->tdr.pa, true,
> +                               tdx_global_keyid))
> +               return;
> +
> +       free_page(kvm_tdx->tdr.va);
> +}
> +
> +static int tdx_do_tdh_mng_key_config(void *param)
> +{
> +       hpa_t *tdr_p = param;
> +       u64 err;
> +
> +       do {
> +               err = tdh_mng_key_config(*tdr_p);
> +
> +               /*
> +                * If it failed to generate a random key, retry it because this
> +                * is typically caused by an entropy error of the CPU's random
> +                * number generator.
> +                */
> +       } while (err == TDX_KEY_GENERATION_FAILED);
> +
> +       if (WARN_ON_ONCE(err)) {
> +               pr_tdx_error(TDH_MNG_KEY_CONFIG, err, NULL);
> +               return -EIO;
> +       }
> +
> +       return 0;
> +}
> +
> +int tdx_vm_init(struct kvm *kvm)
> +{
> +       struct kvm_tdx *kvm_tdx = to_kvm_tdx(kvm);
> +       cpumask_var_t packages;
> +       int ret, i;
> +       u64 err;
> +
> +       ret = tdx_keyid_alloc();

Can we skip the hkid allocation at such an early stage?
This makes intra-host migration more complicated as the hkid of the
destination VM is already allocated before we have a chance to migrate
the state from the source VM.

I remember you had an internal version that already did that in
https://github.com/intel/tdx/blob/552dd80c48f67ca01bcdd10667e0c11efd375177/arch/x86/kvm/vmx/tdx.c#L508

> +       if (ret < 0)
> +               return ret;
> +       kvm_tdx->hkid = ret;
> +
> +       ret = tdx_alloc_td_page(&kvm_tdx->tdr);
> +       if (ret)
> +               goto free_hkid;
> +
> +       kvm_tdx->tdcs = kcalloc(tdx_caps.tdcs_nr_pages, sizeof(*kvm_tdx->tdcs),
> +                               GFP_KERNEL_ACCOUNT | __GFP_ZERO);
> +       if (!kvm_tdx->tdcs)
> +               goto free_tdr;
> +       for (i = 0; i < tdx_caps.tdcs_nr_pages; i++) {
> +               ret = tdx_alloc_td_page(&kvm_tdx->tdcs[i]);
> +               if (ret)
> +                       goto free_tdcs;
> +       }
> +
> +       if (!zalloc_cpumask_var(&packages, GFP_KERNEL)) {
> +               ret = -ENOMEM;
> +               goto free_tdcs;
> +       }
> +       cpus_read_lock();
> +       /*
> +        * Need at least one CPU of the package to be online in order to
> +        * program all packages for host key id.  Check it.
> +        */
> +       for_each_present_cpu(i)
> +               cpumask_set_cpu(topology_physical_package_id(i), packages);
> +       for_each_online_cpu(i)
> +               cpumask_clear_cpu(topology_physical_package_id(i), packages);
> +       if (!cpumask_empty(packages)) {
> +               ret = -EIO;
> +               /*
> +                * Because it's hard for human operator to figure out the
> +                * reason, warn it.
> +                */
> +               pr_warn("All packages need to have online CPU to create TD. Online CPU and retry.\n");
> +               goto free_packages;
> +       }
> +
> +       /*
> +        * Acquire global lock to avoid TDX_OPERAND_BUSY:
> +        * TDH.MNG.CREATE and other APIs try to lock the global Key Owner
> +        * Table (KOT) to track the assigned TDX private HKID.  It doesn't spin
> +        * to acquire the lock, returns TDX_OPERAND_BUSY instead, and let the
> +        * caller to handle the contention.  This is because of time limitation
> +        * usable inside the TDX module and OS/VMM knows better about process
> +        * scheduling.
> +        *
> +        * APIs to acquire the lock of KOT:
> +        * TDH.MNG.CREATE, TDH.MNG.KEY.FREEID, TDH.MNG.VPFLUSHDONE, and
> +        * TDH.PHYMEM.CACHE.WB.
> +        */
> +       mutex_lock(&tdx_lock);
> +       err = tdh_mng_create(kvm_tdx->tdr.pa, kvm_tdx->hkid);
> +       mutex_unlock(&tdx_lock);
> +       if (WARN_ON_ONCE(err)) {
> +               pr_tdx_error(TDH_MNG_CREATE, err, NULL);
> +               ret = -EIO;
> +               goto free_packages;
> +       }
> +       tdx_mark_td_page_added(&kvm_tdx->tdr);
> +
> +       for_each_online_cpu(i) {
> +               int pkg = topology_physical_package_id(i);
> +
> +               if (cpumask_test_and_set_cpu(pkg, packages))
> +                       continue;
> +
> +               /*
> +                * Program the memory controller in the package with an
> +                * encryption key associated to a TDX private host key id
> +                * assigned to this TDR.  Concurrent operations on same memory
> +                * controller results in TDX_OPERAND_BUSY.  Avoid this race by
> +                * mutex.
> +                */
> +               mutex_lock(&tdx_mng_key_config_lock[pkg]);
> +               ret = smp_call_on_cpu(i, tdx_do_tdh_mng_key_config,
> +                                     &kvm_tdx->tdr.pa, true);
> +               mutex_unlock(&tdx_mng_key_config_lock[pkg]);
> +               if (ret)
> +                       break;
> +       }
> +       cpus_read_unlock();
> +       free_cpumask_var(packages);
> +       if (ret)
> +               goto teardown;
> +
> +       for (i = 0; i < tdx_caps.tdcs_nr_pages; i++) {
> +               err = tdh_mng_addcx(kvm_tdx->tdr.pa, kvm_tdx->tdcs[i].pa);
> +               if (WARN_ON_ONCE(err)) {
> +                       pr_tdx_error(TDH_MNG_ADDCX, err, NULL);
> +                       ret = -EIO;
> +                       goto teardown;
> +               }
> +               tdx_mark_td_page_added(&kvm_tdx->tdcs[i]);
> +       }
> +
> +       /*
> +        * Note, TDH_MNG_INIT cannot be invoked here.  TDH_MNG_INIT requires a dedicated
> +        * ioctl() to define the configure CPUID values for the TD.
> +        */
> +       return 0;
> +
> +       /*
> +        * The sequence for freeing resources from a partially initialized TD
> +        * varies based on where in the initialization flow failure occurred.
> +        * Simply use the full teardown and destroy, which naturally play nice
> +        * with partial initialization.
> +        */
> +teardown:
> +       tdx_mmu_release_hkid(kvm);
> +       tdx_vm_free(kvm);
> +       return ret;
> +
> +free_packages:
> +       cpus_read_unlock();
> +       free_cpumask_var(packages);
> +free_tdcs:
> +       for (i = 0; i < tdx_caps.tdcs_nr_pages; i++) {
> +               if (!kvm_tdx->tdcs[i].va)
> +                       continue;
> +               free_page(kvm_tdx->tdcs[i].va);
> +       }
> +       kfree(kvm_tdx->tdcs);
> +       kvm_tdx->tdcs = NULL;
> +free_tdr:
> +       if (kvm_tdx->tdr.va) {
> +               free_page(kvm_tdx->tdr.va);
> +               kvm_tdx->tdr.added = false;
> +               kvm_tdx->tdr.va = 0;
> +               kvm_tdx->tdr.pa = 0;
> +       }
> +free_hkid:
> +       if (kvm_tdx->hkid != -1)
> +               tdx_hkid_free(kvm_tdx);
> +       return ret;
> +}
> +
>  static int __init tdx_module_setup(void)
>  {
>         const struct tdsysinfo_struct *tdsysinfo;
> @@ -82,6 +477,8 @@ bool tdx_is_vm_type_supported(unsigned long type)
>
>  int __init tdx_hardware_setup(struct kvm_x86_ops *x86_ops)
>  {
> +       int max_pkgs;
> +       int i;
>         int r;
>
>         if (!enable_ept) {
> @@ -95,6 +492,14 @@ int __init tdx_hardware_setup(struct kvm_x86_ops *x86_ops)
>                 return -ENODEV;
>         }
>
> +       max_pkgs = topology_max_packages();
> +       tdx_mng_key_config_lock = kcalloc(max_pkgs, sizeof(*tdx_mng_key_config_lock),
> +                                  GFP_KERNEL);
> +       if (!tdx_mng_key_config_lock)
> +               return -ENOMEM;
> +       for (i = 0; i < max_pkgs; i++)
> +               mutex_init(&tdx_mng_key_config_lock[i]);
> +
>         /* TDX requires VMX. */
>         r = vmxon_all();
>         if (!r)
> @@ -103,3 +508,9 @@ int __init tdx_hardware_setup(struct kvm_x86_ops *x86_ops)
>
>         return r;
>  }
> +
> +void tdx_hardware_unsetup(void)
> +{
> +       /* kfree accepts NULL. */
> +       kfree(tdx_mng_key_config_lock);
> +}
> diff --git a/arch/x86/kvm/vmx/tdx.h b/arch/x86/kvm/vmx/tdx.h
> index 98999bf3f188..938314635b47 100644
> --- a/arch/x86/kvm/vmx/tdx.h
> +++ b/arch/x86/kvm/vmx/tdx.h
> @@ -17,6 +17,8 @@ struct kvm_tdx {
>
>         struct tdx_td_page tdr;
>         struct tdx_td_page *tdcs;
> +
> +       int hkid;
>  };
>
>  struct vcpu_tdx {
> diff --git a/arch/x86/kvm/vmx/x86_ops.h b/arch/x86/kvm/vmx/x86_ops.h
> index ac1688b0b0e3..95da978c9aa9 100644
> --- a/arch/x86/kvm/vmx/x86_ops.h
> +++ b/arch/x86/kvm/vmx/x86_ops.h
> @@ -133,9 +133,20 @@ void vmx_setup_mce(struct kvm_vcpu *vcpu);
>  #ifdef CONFIG_INTEL_TDX_HOST
>  int __init tdx_hardware_setup(struct kvm_x86_ops *x86_ops);
>  bool tdx_is_vm_type_supported(unsigned long type);
> +void tdx_hardware_unsetup(void);
> +
> +int tdx_vm_init(struct kvm *kvm);
> +void tdx_mmu_release_hkid(struct kvm *kvm);
> +void tdx_vm_free(struct kvm *kvm);
>  #else
>  static inline int tdx_hardware_setup(struct kvm_x86_ops *x86_ops) { return 0; }
>  static inline bool tdx_is_vm_type_supported(unsigned long type) { return false; }
> +static inline void tdx_hardware_unsetup(void) {}
> +
> +static inline int tdx_vm_init(struct kvm *kvm) { return -EOPNOTSUPP; }
> +static inline void tdx_mmu_release_hkid(struct kvm *kvm) {}
> +static inline void tdx_flush_shadow_all_private(struct kvm *kvm) {}
> +static inline void tdx_vm_free(struct kvm *kvm) {}
>  #endif
>
>  #endif /* __KVM_X86_VMX_X86_OPS_H */
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 91053fdc4512..4b22196cb12c 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -12702,6 +12702,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
>         kvm_page_track_cleanup(kvm);
>         kvm_xen_destroy_vm(kvm);
>         kvm_hv_destroy_vm(kvm);
> +       static_call_cond(kvm_x86_vm_free)(kvm);
>  }
>
>  static void memslot_rmap_free(struct kvm_memory_slot *slot)
> @@ -13012,6 +13013,13 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
>
>  void kvm_arch_flush_shadow_all(struct kvm *kvm)
>  {
> +       /*
> +        * kvm_mmu_zap_all() zaps both private and shared page tables.  Before
> +        * tearing down private page tables, TDX requires some TD resources to
> +        * be destroyed (i.e. keyID must have been reclaimed, etc).  Invoke
> +        * kvm_x86_flush_shadow_all_private() for this.
> +        */
> +       static_call_cond(kvm_x86_flush_shadow_all_private)(kvm);
>         kvm_mmu_zap_all(kvm);
>  }
>
> --
> 2.25.1
>

  parent reply	other threads:[~2022-11-15  0:06 UTC|newest]

Thread overview: 228+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-30  6:22 [PATCH v10 000/108] KVM TDX basic feature support isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 001/108] KVM: VMX: Move out vmx_x86_ops to 'main.c' to wrap VMX and TDX isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 002/108] KVM: x86: Refactor KVM VMX module init/exit functions isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 003/108] KVM: TDX: Add placeholders for TDX VM/vcpu structure isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 004/108] x86/virt/tdx: Add a helper function to return system wide info about TDX module isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 005/108] KVM: TDX: Initialize the TDX module when loading the KVM intel kernel module isaku.yamahata
2022-11-08  1:29   ` Huang, Kai
2022-11-08 18:48     ` Sean Christopherson
2022-11-14 23:18     ` Isaku Yamahata
2022-11-15  1:58       ` Huang, Kai
2022-11-15 12:22       ` Erdem Aktas
2022-11-17 17:33         ` Isaku Yamahata
2023-01-11 22:02   ` Erdem Aktas
2023-01-12  3:08     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 006/108] KVM: x86: Introduce vm_type to differentiate default VMs from confidential VMs isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 007/108] KVM: TDX: Make TDX VM type supported isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 008/108] [MARKER] The start of TDX KVM patch series: TDX architectural definitions isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 009/108] KVM: TDX: Define " isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 010/108] KVM: TDX: Add TDX "architectural" error codes isaku.yamahata
2022-10-31  9:22   ` Binbin Wu
2022-11-03  0:05     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 011/108] KVM: TDX: Add C wrapper functions for SEAMCALLs to the TDX module isaku.yamahata
2022-11-23 10:00   ` Zhi Wang
2022-12-15 19:45     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 012/108] KVM: TDX: Add helper functions to print TDX SEAMCALL error isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 013/108] [MARKER] The start of TDX KVM patch series: TD VM creation/destruction isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 014/108] KVM: TDX: Stub in tdx.h with structs, accessors, and VMCS helpers isaku.yamahata
2022-10-31 11:39   ` Binbin Wu
2022-11-03  0:57     ` Isaku Yamahata
2022-11-10 11:11   ` Huang, Kai
2022-10-30  6:22 ` [PATCH v10 015/108] x86/cpu: Add helper functions to allocate/free TDX private host key id isaku.yamahata
2022-11-08  9:16   ` Huang, Kai
2022-11-17 17:34     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 016/108] KVM: TDX: create/destroy VM structure isaku.yamahata
2022-11-10 11:04   ` Huang, Kai
2022-11-17 17:45     ` Isaku Yamahata
2022-11-15  0:06   ` Sagi Shahar [this message]
2022-11-17 17:48     ` Isaku Yamahata
2022-11-17 23:45       ` Sagi Shahar
2022-11-23 10:36   ` Zhi Wang
2022-12-15 19:59     ` Isaku Yamahata
2022-12-09 19:15   ` Ackerley Tng
2022-12-15 20:59     ` Isaku Yamahata
2023-01-03 18:17       ` Ackerley Tng
2023-01-04  3:58   ` Wang, Lei
2022-10-30  6:22 ` [PATCH v10 017/108] KVM: TDX: Refuse to unplug the last cpu on the package isaku.yamahata
2022-11-02  8:06   ` Binbin Wu
2022-11-03  2:01     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 018/108] KVM: TDX: x86: Add ioctl to get TDX systemwide parameters isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 019/108] KVM: TDX: Add place holder for TDX VM specific mem_enc_op ioctl isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 020/108] KVM: Support KVM_CAP_MAX_VCPUS for KVM_ENABLE_CAP isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 021/108] KVM: TDX: initialize VM with TDX specific parameters isaku.yamahata
2022-11-16  5:34   ` Wang, Lei
2022-11-17 17:51     ` Isaku Yamahata
2023-01-04  7:59   ` Wang, Lei
2023-01-12  3:12     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 022/108] KVM: TDX: Make pmu_intel.c ignore guest TD case isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 023/108] [MARKER] The start of TDX KVM patch series: TD vcpu creation/destruction isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 024/108] KVM: TDX: allocate/free TDX vcpu structure isaku.yamahata
2022-11-14  6:46   ` Yuan Yao
2022-12-15 21:28     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 025/108] KVM: TDX: Do TDX specific vcpu initialization isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 026/108] KVM: TDX: Use private memory for TDX isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 027/108] [MARKER] The start of TDX KVM patch series: KVM MMU GPA shared bits isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 028/108] KVM: x86/mmu: introduce config for PRIVATE KVM MMU isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 029/108] KVM: x86/mmu: Add address conversion functions for TDX shared bit of GPA isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 030/108] [MARKER] The start of TDX KVM patch series: KVM TDP refactoring for TDX isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 031/108] KVM: x86/mmu: Replace hardcoded value 0 for the initial value for SPTE isaku.yamahata
2022-11-03  7:17   ` Binbin Wu
2022-11-03  8:00     ` Binbin Wu
2022-11-08 11:33   ` Huang, Kai
2022-11-17 17:55     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 032/108] KVM: x86/mmu: Make sync_page not use hard-coded 0 as the initial SPTE value isaku.yamahata
2022-11-09 11:24   ` Huang, Kai
2022-11-17 17:55     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 033/108] KVM: x86/mmu: Allow non-zero value for non-present SPTE and removed SPTE isaku.yamahata
2022-11-09 11:24   ` Huang, Kai
2022-11-17 17:58     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 034/108] KVM: x86/mmu: Add Suppress VE bit to shadow_mmio_{value, mask} isaku.yamahata
2022-11-09 11:48   ` Huang, Kai
2022-11-17 18:02     ` Isaku Yamahata
2022-11-28 23:51       ` Sean Christopherson
2022-10-30  6:22 ` [PATCH v10 035/108] KVM: x86/mmu: Track shadow MMIO value on a per-VM basis isaku.yamahata
2022-11-09 12:27   ` Huang, Kai
2022-11-22  2:10   ` Yan Zhao
2022-11-25  0:13     ` Huang, Kai
2022-11-25  0:12       ` Yan Zhao
2022-11-25  0:45         ` Huang, Kai
2022-11-25  0:37           ` Yan Zhao
2022-11-25  1:07             ` Huang, Kai
2022-11-25  1:04               ` Yan Zhao
2022-11-28 23:49                 ` Sean Christopherson
2022-10-30  6:22 ` [PATCH v10 036/108] KVM: TDX: Enable mmio spte caching always for TDX isaku.yamahata
2022-11-09 12:46   ` Huang, Kai
2022-10-30  6:22 ` [PATCH v10 037/108] KVM: x86/mmu: Disallow fast page fault on private GPA isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 038/108] KVM: x86/mmu: Allow per-VM override of the TDP max page level isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 039/108] KVM: VMX: Introduce test mode related to EPT violation VE isaku.yamahata
2022-11-03 13:41   ` Binbin Wu
2022-11-03 20:13     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 040/108] [MARKER] The start of TDX KVM patch series: KVM TDP MMU hooks isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 041/108] KVM: x86/tdp_mmu: refactor kvm_tdp_mmu_map() isaku.yamahata
2022-11-16  9:42   ` Huang, Kai
2022-11-17 18:37     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 042/108] KVM: x86/tdp_mmu: Init role member of struct kvm_mmu_page at allocation isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 043/108] KVM: x86/mmu: Require TDP MMU for TDX isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 044/108] KVM: x86/mmu: Add a new is_private member for union kvm_mmu_page_role isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 045/108] KVM: x86/mmu: Add a private pointer to struct kvm_mmu_page isaku.yamahata
2022-11-16 10:32   ` Huang, Kai
2022-11-16 11:53     ` Huang, Kai
2022-11-17 19:25       ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 046/108] KVM: Add flags to struct kvm_gfn_range isaku.yamahata
2022-12-14 10:51   ` Huang, Kai
2022-12-15 22:10     ` Isaku Yamahata
2022-12-15 22:41       ` Huang, Kai
2022-10-30  6:22 ` [PATCH v10 047/108] KVM: x86/tdp_mmu: Don't zap private pages for unsupported cases isaku.yamahata
2022-11-22 21:26   ` Ackerley Tng
2022-12-14 11:17   ` Huang, Kai
2022-12-15 22:46     ` Isaku Yamahata
2022-12-15 23:03       ` Huang, Kai
2022-12-15 23:27       ` Huang, Kai
2022-10-30  6:22 ` [PATCH v10 048/108] KVM: x86/tdp_mmu: Make handle_changed_spte() return value isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 049/108] KVM: x86/tdp_mmu: Support TDX private mapping for TDP MMU isaku.yamahata
2022-11-08 13:41   ` Binbin Wu
2022-11-17 19:59     ` Isaku Yamahata
2022-11-16  1:40   ` Chenyi Qiang
2022-11-17 19:26     ` Isaku Yamahata
2022-11-16 11:58   ` Huang, Kai
2022-11-17 19:31     ` Isaku Yamahata
2022-10-30  6:22 ` [PATCH v10 050/108] [MARKER] The start of TDX KVM patch series: TDX EPT violation isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 051/108] KVM: x86/mmu: Disallow dirty logging for x86 TDX isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 052/108] KVM: x86/tdp_mmu: Ignore unsupported mmu operation on private GFNs isaku.yamahata
2022-12-05 14:23   ` Wang, Wei W
2022-12-15 23:21     ` Isaku Yamahata
2022-12-19 13:15       ` Wang, Wei W
2022-10-30  6:22 ` [PATCH v10 053/108] KVM: VMX: Split out guts of EPT violation to common/exposed function isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 054/108] KVM: VMX: Move setting of EPT MMU masks to common VT-x code isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 055/108] KVM: TDX: Add load_mmu_pgd method for TDX isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 056/108] KVM: TDX: don't request KVM_REQ_APIC_PAGE_RELOAD isaku.yamahata
2022-11-21 23:55   ` Huang, Kai
2022-12-16  0:11     ` Isaku Yamahata
2022-12-16  0:31       ` Huang, Kai
2022-10-30  6:22 ` [PATCH v10 057/108] KVM: x86/VMX: introduce vmx tlb_remote_flush and tlb_remote_flush_with_range isaku.yamahata
2022-10-30  6:22 ` [PATCH v10 058/108] KVM: TDX: TDP MMU TDX support isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 059/108] [MARKER] The start of TDX KVM patch series: KVM TDP MMU MapGPA isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 060/108] KVM: Add functions to set GFN to private or shared isaku.yamahata
2022-11-01 10:21   ` Xiaoyao Li
2022-11-03  2:01     ` Isaku Yamahata
2022-11-09 13:18   ` Binbin Wu
2022-10-30  6:23 ` [PATCH v10 061/108] KVM: x86/mmu: Introduce kvm_mmu_map_tdp_page() for use by TDX isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 062/108] KVM: x86/tdp_mmu: implement MapGPA hypercall for TDX isaku.yamahata
2022-11-09 15:05   ` Binbin Wu
2022-12-09  0:01     ` Vishal Annapurve
2022-12-16  0:31       ` Isaku Yamahata
2022-12-16  0:18     ` Isaku Yamahata
2022-10-30  6:23 ` [PATCH v10 063/108] [MARKER] The start of TDX KVM patch series: TD finalization isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 064/108] KVM: TDX: Create initial guest memory isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 065/108] KVM: TDX: Finalize VM initialization isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 066/108] [MARKER] The start of TDX KVM patch series: TD vcpu enter/exit isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 067/108] KVM: TDX: Add helper assembly function to TDX vcpu isaku.yamahata
2023-01-17 23:36   ` Ackerley Tng
2022-10-30  6:23 ` [PATCH v10 068/108] KVM: TDX: Implement TDX vcpu enter/exit path isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 069/108] KVM: TDX: vcpu_run: save/restore host state(host kernel gs) isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 070/108] KVM: TDX: restore host xsave state when exit from the guest TD isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 071/108] KVM: x86: Allow to update cached values in kvm_user_return_msrs w/o wrmsr isaku.yamahata
2022-11-14  7:36   ` Binbin Wu
2022-11-17 20:10     ` Isaku Yamahata
2022-10-30  6:23 ` [PATCH v10 072/108] KVM: TDX: restore user ret MSRs isaku.yamahata
2022-11-14  7:49   ` Binbin Wu
2022-11-17 20:14     ` Isaku Yamahata
2022-10-30  6:23 ` [PATCH v10 073/108] [MARKER] The start of TDX KVM patch series: TD vcpu exits/interrupts/hypercalls isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 074/108] KVM: TDX: complete interrupts after tdexit isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 075/108] KVM: TDX: restore debug store when TD exit isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 076/108] KVM: TDX: handle vcpu migration over logical processor isaku.yamahata
2022-11-15  2:28   ` Binbin Wu
2022-11-17 20:24     ` Isaku Yamahata
2022-10-30  6:23 ` [PATCH v10 077/108] KVM: x86: Add a switch_db_regs flag to handle TDX's auto-switched behavior isaku.yamahata
2022-11-16  2:41   ` Binbin Wu
2022-12-16  1:12     ` Isaku Yamahata
2022-10-30  6:23 ` [PATCH v10 078/108] KVM: TDX: Add support for find pending IRQ in a protected local APIC isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 079/108] KVM: x86: Assume timer IRQ was injected if APIC state is proteced isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 080/108] KVM: TDX: remove use of struct vcpu_vmx from posted_interrupt.c isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 081/108] KVM: TDX: Implement interrupt injection isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 082/108] KVM: TDX: Implements vcpu request_immediate_exit isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 083/108] KVM: TDX: Implement methods to inject NMI isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 084/108] KVM: VMX: Modify NMI and INTR handlers to take intr_info as function argument isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 085/108] KVM: VMX: Move NMI/exception handler to common helper isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 086/108] KVM: x86: Split core of hypercall emulation to helper function isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 087/108] KVM: TDX: Add a place holder to handle TDX VM exit isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 088/108] KVM: TDX: Retry seamcall when TDX_OPERAND_BUSY with operand SEPT isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 089/108] KVM: TDX: handle EXIT_REASON_OTHER_SMI isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 090/108] KVM: TDX: handle ept violation/misconfig exit isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 091/108] KVM: TDX: handle EXCEPTION_NMI and EXTERNAL_INTERRUPT isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 092/108] KVM: TDX: Add a place holder for handler of TDX hypercalls (TDG.VP.VMCALL) isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 093/108] KVM: TDX: handle KVM hypercall with TDG.VP.VMCALL isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 094/108] KVM: TDX: Handle TDX PV CPUID hypercall isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 095/108] KVM: TDX: Handle TDX PV HLT hypercall isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 096/108] KVM: TDX: Handle TDX PV port io hypercall isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 097/108] KVM: TDX: Handle TDX PV MMIO hypercall isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 098/108] KVM: TDX: Implement callbacks for MSR operations for TDX isaku.yamahata
2022-11-23 14:25   ` Binbin Wu
2022-12-16  1:29     ` Isaku Yamahata
2022-12-14 11:22   ` Huang, Kai
2022-12-16  1:39     ` Isaku Yamahata
2023-01-04 21:20   ` Ackerley Tng
2023-01-12 10:06     ` Isaku Yamahata
2022-10-30  6:23 ` [PATCH v10 099/108] KVM: TDX: Handle TDX PV rdmsr/wrmsr hypercall isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 100/108] KVM: TDX: Handle TDX PV report fatal error hypercall isaku.yamahata
2022-11-23 14:47   ` Binbin Wu
2022-10-30  6:23 ` [PATCH v10 101/108] KVM: TDX: Handle TDX PV map_gpa hypercall isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 102/108] KVM: TDX: Handle TDG.VP.VMCALL<GetTdVmCallInfo> hypercall isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 103/108] KVM: TDX: Silently discard SMI request isaku.yamahata
2022-10-30  6:23 ` [PATCH v10 104/108] KVM: TDX: Silently ignore INIT/SIPI isaku.yamahata
2022-11-23 15:17   ` Binbin Wu
2022-12-16  3:50     ` Isaku Yamahata
2022-12-16 15:49   ` Sean Christopherson
2022-10-30  6:23 ` [PATCH v10 105/108] KVM: TDX: Add methods to ignore accesses to CPU state isaku.yamahata
2022-11-22  1:18   ` Huang, Kai
2022-12-14 11:43   ` Huang, Kai
2022-12-16  5:26     ` Isaku Yamahata
2022-12-19 10:46       ` Huang, Kai
2022-10-30  6:23 ` [PATCH v10 106/108] Documentation/virt/kvm: Document on Trust Domain Extensions(TDX) isaku.yamahata
2022-11-25  3:49   ` Binbin Wu
2022-12-16  3:58     ` Isaku Yamahata
2022-10-30  6:23 ` [PATCH v10 107/108] KVM: x86: design documentation on TDX support of x86 KVM TDP MMU isaku.yamahata
2022-10-31  4:23   ` Bagas Sanjaya
2022-10-30  6:23 ` [PATCH v10 108/108] [MARKER] the end of (the first phase of) TDX KVM patch series isaku.yamahata
2023-01-03  8:26 ` [PATCH v10 000/108] KVM TDX basic feature support Wang, Lei
2023-01-12 16:16   ` Isaku Yamahata

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAAhR5DFGvGQmf95hrGcK0uvawvFrzdCisnEtvLV8k8pM3FRV_w@mail.gmail.com \
    --to=sagis@google.com \
    --cc=dmatlack@google.com \
    --cc=erdemaktas@google.com \
    --cc=isaku.yamahata@gmail.com \
    --cc=isaku.yamahata@intel.com \
    --cc=kai.huang@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=sean.j.christopherson@intel.com \
    --cc=seanjc@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.