From: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
To: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"pbonzini@redhat.com" <pbonzini@redhat.com>,
"seanjc@google.com" <seanjc@google.com>,
"Zhao, Yan Y" <yan.y.zhao@intel.com>
Cc: "isaku.yamahata@gmail.com" <isaku.yamahata@gmail.com>,
"x86@kernel.org" <x86@kernel.org>,
"dave.hansen@linux.intel.com" <dave.hansen@linux.intel.com>,
"binbin.wu@linux.intel.com" <binbin.wu@linux.intel.com>,
"Li, Xiaoyao" <xiaoyao.li@intel.com>,
"Chatre, Reinette" <reinette.chatre@intel.com>,
"Hunter, Adrian" <adrian.hunter@intel.com>,
"Lindgren, Tony" <tony.lindgren@intel.com>,
"dmatlack@google.com" <dmatlack@google.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"Yamahata, Isaku" <isaku.yamahata@intel.com>,
"Huang, Kai" <kai.huang@intel.com>,
"nik.borisov@suse.com" <nik.borisov@suse.com>
Subject: Re: [RFC PATCH 0/2] SEPT SEAMCALL retry proposal
Date: Tue, 26 Nov 2024 00:46:51 +0000 [thread overview]
Message-ID: <4a3b3b6bc96e111e5380de4681a20c2734d82a33.camel@intel.com> (raw)
In-Reply-To: <20241121115139.26338-1-yan.y.zhao@intel.com>
On Thu, 2024-11-21 at 19:51 +0800, Yan Zhao wrote:
> ==proposal details==
>
> The proposal discusses SEPT-related and TLB-flush-related SEAMCALLs
> together which are required for page installation and uninstallation.
>
> These SEAMCALLs can be divided into three groups:
> Group 1: tdh_mem_page_add().
> The SEAMCALL is invoked only during TD build time and therefore
> KVM has ensured that no contention will occur.
>
> Proposal: (as in patch 1)
> Just return error when TDX_OPERAND_BUSY is found.
>
> Group 2: tdh_mem_sept_add(), tdh_mem_page_aug().
> These two SEAMCALLs are invoked for page installation.
> They return TDX_OPERAND_BUSY when contending with tdh_vp_enter()
> (due to 0-step mitigation) or TDCALLs tdg_mem_page_accept(),
> tdg_mem_page_attr_rd/wr().
We did verify with TDX module folks that the TDX module could be changed to not
take the sept host priority lock for zero entries (that happen during the guest
operations). In that case, I think we shouldn't expect contention for
tdh_mem_sept_add() and tdh_mem_page_aug() from them? We still need it for
tdh_vp_enter() though.
>
> Proposal: (as in patch 1)
> - Return -EBUSY in KVM for TDX_OPERAND_BUSY to cause RET_PF_RETRY
> to be returned in kvm_mmu_do_page_fault()/kvm_mmu_page_fault().
>
> - Inside TDX's EPT violation handler, retry on RET_PF_RETRY as
> long as there are no pending signals/interrupts.
>
> The retry inside TDX aims to reduce the count of tdh_vp_enter()
> before resolving EPT violations in the local vCPU, thereby
> minimizing contentions with other vCPUs. However, it can't
> completely eliminate 0-step mitigation as it exits when there're
> pending signals/interrupts and does not (and cannot) remove the
> tdh_vp_enter() caused by KVM_EXIT_MEMORY_FAULT.
>
> Resources SHARED users EXCLUSIVE users
> ------------------------------------------------------------
> SEPT tree tdh_mem_sept_add tdh_vp_enter(0-step mitigation)
> tdh_mem_page_aug
> ------------------------------------------------------------
> SEPT entry tdh_mem_sept_add (Host lock)
> tdh_mem_page_aug (Host lock)
> tdg_mem_page_accept (Guest lock)
> tdg_mem_page_attr_rd (Guest lock)
> tdg_mem_page_attr_wr (Guest lock)
>
> Group 3: tdh_mem_range_block(), tdh_mem_track(), tdh_mem_page_remove().
> These three SEAMCALLs are invoked for page uninstallation, with
> KVM mmu_lock held for writing.
>
> Resources SHARED users EXCLUSIVE users
> ------------------------------------------------------------
> TDCS epoch tdh_vp_enter tdh_mem_track
> ------------------------------------------------------------
> SEPT tree tdh_mem_page_remove tdh_vp_enter (0-step mitigation)
> tdh_mem_range_block
> ------------------------------------------------------------
> SEPT entry tdh_mem_range_block (Host lock)
> tdh_mem_page_remove (Host lock)
> tdg_mem_page_accept (Guest lock)
> tdg_mem_page_attr_rd (Guest lock)
> tdg_mem_page_attr_wr (Guest lock)
>
> Proposal: (as in patch 2)
> - Upon detection of TDX_OPERAND_BUSY, retry each SEAMCALL only
> once.
> - During the retry, kick off all vCPUs and prevent any vCPU from
> entering to avoid potential contentions.
>
> This is because tdh_vp_enter() and TDCALLs are not protected by
> KVM mmu_lock, and remove_external_spte() in KVM must not fail.
The solution for group 3 actually doesn't look too bad at all to me. At least
from code and complexity wise. It's pretty compact, doesn't add any locks, and
limited to the tdx.c code. Although, I didn't evaluate the implementation
correctness of tdx_no_vcpus_enter_start() and tdx_no_vcpus_enter_stop() yet.
Were you able to test the fallback path at all? Can we think of any real
situations where it could be burdensome?
One other thing to note I think, is that group 3 are part of no-fail operations.
The core KVM calling code doesn't have the understanding of a failure there. So
in this scheme of not avoiding contention we have to succeed before returning,
where group 1 and 2 can fail, so don't need the special fallback scheme.
next prev parent reply other threads:[~2024-11-26 0:46 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-12 7:33 [PATCH v2 00/24] TDX MMU Part 2 Yan Zhao
2024-11-12 7:34 ` [PATCH v2 01/24] KVM: x86/mmu: Implement memslot deletion for TDX Yan Zhao
2024-11-12 7:34 ` [PATCH v2 02/24] KVM: x86/tdp_mmu: Add a helper function to walk down the TDP MMU Yan Zhao
2024-11-12 7:35 ` [PATCH v2 03/24] KVM: x86/mmu: Do not enable page track for TD guest Yan Zhao
2024-11-12 7:35 ` [PATCH v2 04/24] KVM: VMX: Split out guts of EPT violation to common/exposed function Yan Zhao
2024-11-12 7:35 ` [PATCH v2 05/24] KVM: VMX: Teach EPT violation helper about private mem Yan Zhao
2024-11-12 7:35 ` [PATCH v2 06/24] KVM: TDX: Add accessors VMX VMCS helpers Yan Zhao
2024-11-12 7:36 ` [PATCH v2 07/24] KVM: TDX: Add load_mmu_pgd method for TDX Yan Zhao
2024-11-12 7:36 ` [PATCH v2 08/24] KVM: TDX: Set gfn_direct_bits to shared bit Yan Zhao
2024-11-12 7:36 ` [PATCH v2 09/24] x86/virt/tdx: Add SEAMCALL wrapper tdh_mem_sept_add() to add SEPT pages Yan Zhao
2024-11-12 7:36 ` [PATCH v2 10/24] x86/virt/tdx: Add SEAMCALL wrappers to add TD private pages Yan Zhao
2024-11-12 7:36 ` [PATCH v2 11/24] x86/virt/tdx: Add SEAMCALL wrappers to manage TDX TLB tracking Yan Zhao
2024-11-12 7:36 ` [PATCH v2 12/24] x86/virt/tdx: Add SEAMCALL wrappers to remove a TD private page Yan Zhao
2024-11-12 7:37 ` [PATCH v2 13/24] x86/virt/tdx: Add SEAMCALL wrappers for TD measurement of initial contents Yan Zhao
2024-11-12 7:37 ` [PATCH v2 14/24] KVM: TDX: Require TDP MMU and mmio caching for TDX Yan Zhao
2024-11-12 7:37 ` [PATCH v2 15/24] KVM: x86/mmu: Add setter for shadow_mmio_value Yan Zhao
2024-11-12 7:37 ` [PATCH v2 16/24] KVM: TDX: Set per-VM shadow_mmio_value to 0 Yan Zhao
2024-11-12 7:37 ` [PATCH v2 17/24] KVM: TDX: Handle TLB tracking for TDX Yan Zhao
2024-11-12 7:38 ` [PATCH v2 18/24] KVM: TDX: Implement hooks to propagate changes of TDP MMU mirror page table Yan Zhao
2024-11-12 7:38 ` [PATCH v2 19/24] KVM: TDX: Implement hook to get max mapping level of private pages Yan Zhao
2024-11-12 7:38 ` [PATCH v2 20/24] KVM: x86/mmu: Export kvm_tdp_map_page() Yan Zhao
2024-11-12 7:38 ` [PATCH v2 21/24] KVM: TDX: Add an ioctl to create initial guest memory Yan Zhao
2024-11-27 18:08 ` Nikolay Borisov
2024-11-28 2:20 ` Yan Zhao
2024-11-12 7:38 ` [PATCH v2 22/24] KVM: TDX: Finalize VM initialization Yan Zhao
2024-12-24 14:31 ` Paolo Bonzini
2025-01-07 7:44 ` Yan Zhao
2025-01-07 14:02 ` Paolo Bonzini
2025-01-08 2:18 ` Yan Zhao
2024-11-12 7:38 ` [PATCH v2 23/24] KVM: TDX: Handle vCPU dissociation Yan Zhao
2024-11-12 7:39 ` [PATCH v2 24/24] [HACK] KVM: TDX: Retry seamcall when TDX_OPERAND_BUSY with operand SEPT Yan Zhao
2024-11-21 11:51 ` [RFC PATCH 0/2] SEPT SEAMCALL retry proposal Yan Zhao
2024-11-21 11:56 ` [RFC PATCH 1/2] KVM: TDX: Retry in TDX when installing TD private/sept pages Yan Zhao
2024-11-21 11:57 ` [RFC PATCH 2/2] KVM: TDX: Kick off vCPUs when SEAMCALL is busy during TD page removal Yan Zhao
2024-11-26 0:47 ` Edgecombe, Rick P
2024-11-26 6:39 ` Yan Zhao
2024-12-17 23:29 ` Sean Christopherson
2024-12-18 5:45 ` Yan Zhao
2024-12-18 16:10 ` Sean Christopherson
2024-12-19 1:52 ` Yan Zhao
2024-12-19 2:39 ` Sean Christopherson
2024-12-19 3:03 ` Yan Zhao
2024-11-26 0:46 ` Edgecombe, Rick P [this message]
2024-11-26 6:24 ` [RFC PATCH 0/2] SEPT SEAMCALL retry proposal Yan Zhao
2024-12-13 1:01 ` Yan Zhao
2024-12-17 17:00 ` Edgecombe, Rick P
2024-12-17 23:18 ` Sean Christopherson
2024-12-10 18:21 ` [PATCH v2 00/24] TDX MMU Part 2 Paolo Bonzini
2024-12-24 14:33 ` Paolo Bonzini
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=4a3b3b6bc96e111e5380de4681a20c2734d82a33.camel@intel.com \
--to=rick.p.edgecombe@intel.com \
--cc=adrian.hunter@intel.com \
--cc=binbin.wu@linux.intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=dmatlack@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=nik.borisov@suse.com \
--cc=pbonzini@redhat.com \
--cc=reinette.chatre@intel.com \
--cc=seanjc@google.com \
--cc=tony.lindgren@intel.com \
--cc=x86@kernel.org \
--cc=xiaoyao.li@intel.com \
--cc=yan.y.zhao@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®