Re: [PATCH v7 05/11] x86/virt/tdx: Handle multiple callers in tdx_pamt_get/put()
Nikolay Borisov <[email protected]>
| Newsgroups | dev.linux.lists.linux-coco,org.kernel.vger.kvm,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 7/18/26 04:44, Rick Edgecombe wrote: > From: "Kirill A. Shutemov" <[email protected]> > > tdx_pamt_get()/tdx_pamt_put() unconditionally add or remove Dynamic PAMT > backing for the 2MB region covering the passed page. However, multiple > callers can add or remove 4KB pages that fall within the same 2MB region > and in that scenario only a single PAMT entry is required. > > Make the helpers handle only adding/removing Dynamic PAMT backing when > required, by refcounting each 2MB range. Gate the actual Dynamic PAMT add > and remove on refcount transitions (0->1 and 1->0). Serialize the refcount > check and SEAMCALL with a global spinlock so the read-decide-act sequence > is atomic. This also avoids TDX module BUSY errors, as the Dynamic PAMT add > and remove SEAMCALLs take internal TDX module locks for the 2MB ranges of > the specified PFN and the PAMT page pair PFNs. So simultaneous attempts on > the same 2MB ranges of the PFNs would otherwise encounter an error, which > would not be handleable in the put case. > > The lock is global and heavyweight. Use simple conditional logic to keep > correctness obvious. This will be optimized in a later change. > > The pamt_refcounts[] are atomic_t's. They do not strictly need to be > because all access is protected by pamt_lock. The overhead of an atomic_t > in this situation is minuscule compared to the global lock. Leave the > atomic_t in place to enable future optimization with minimal churn. > > AI was used under supervision to collect/apply feedback, split patches, > review code and workshop logs. > > Signed-off-by: Kirill A. Shutemov <[email protected]> > Co-developed-by: Rick Edgecombe <[email protected]> > Signed-off-by: Rick Edgecombe <[email protected]> > Reviewed-by: Binbin Wu <[email protected]> > Reviewed-by: Chao Gao <[email protected]> > Reviewed-by: Yan Zhao <[email protected]> > Reviewed-by: Tony Lindgren <[email protected]> Reviewed-by: Nikolay Borisov <[email protected]>