From: Sean Christopherson <seanjc@google.com>
To: Yan Zhao <yan.y.zhao@intel.com>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
"Michael Roth" <michael.roth@amd.com>,
"Hyunwoo Kim" <imv4bel@gmail.com>,
"Tom Lendacky" <thomas.lendacky@amd.com>,
"Jörg Rödel" <joro@8bytes.org>, "Fuad Tabba" <tabba@google.com>,
"Ackerley Tng" <ackerleytng@google.com>
Subject: Re: [PATCH v4 18/18] KVM: guest_memfd: Combine .gmem_prepare()+.gmem_invalidate() into .gmem_convert()
Date: Thu, 23 Jul 2026 11:47:42 -0700 [thread overview]
Message-ID: <amJhzgyQMVNVD1S3@google.com> (raw)
In-Reply-To: <amAoijqis2Gn/K2Z@yzhao56-desk.sh.intel.com>
On Wed, Jul 22, 2026, Yan Zhao wrote:
> On Tue, Jul 21, 2026 at 11:57:06AM -0700, Sean Christopherson wrote:
> > > Asking this also because there is a .gmem_convert() for TDX huge pages [1].
> > > In [1], .gmem_convert() is invoked to emulate a to-shared conversion in
> > > kvm_gmem_punch_hole(). However, the per-gmem memory attribute for the range to
> > > convert may not be shared after the punch hole. Is it acceptable?
> > > (To me, the .gmem_convert() in [1] behaves more like .gmem_prezap()).
> >
> > Ya, these concerns got raised by others. pKVM on arm64 in particular wants to
> > hook reclaim but not conversion. The plan is to keep the reclaim and end up with
> > this implementation for x86:
> >
> > #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_CONVERT
> > int kvm_arch_gmem_make_private(struct kvm *kvm, gfn_t gfn, kvm_pfn_t pfn,
> > kvm_pfn_t nr_pages, int max_order)
> > {
> > return kvm_x86_call(gmem_make_private)(kvm, gfn, pfn, nr_pages, max_order);
> > }
> > int kvm_arch_gmem_make_shared(kvm_pfn_t pfn, kvm_pfn_t nr_pages, int max_order,
> > bool to_private)
> > {
> > kvm_x86_call(gmem_make_shared)(pfn, nr_pages, max_order);
> > return 0;
> > }
> For TDX huge pages, if we want to trigger private huge page splitting before
> converting to shared, should we invoke the hooks like this?
>
> __kvm_gmem_set_attributes(to shared)
> |->kvm_arch_gmem_make_shared
> |->kvm_x86_call(gmem_make_shared)(pfn, nr_pages, max_order);
>
> But TDX needs kvm pointer, and splitting pages may fail.
Ya, but those are very solvable problems. They just don't need to be addressed
today, because SNP is the only user of the conversion APIs.
> > #endif
> >
> > #ifdef CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM
> > void kvm_arch_gmem_reclaim(kvm_pfn_t pfn, kvm_pfn_t nr_pages, int max_order)
> > {
> > kvm_x86_call(gmem_make_shared)(pfn, nr_pages, max_order);
> > }
> > #endif
> Is this kvm_arch_gmem_reclaim() invoked by kvm_gmem_free_folio(), and should TDX
> not define CONFIG_HAVE_KVM_ARCH_GMEM_RECLAIM?
Correct.
> As in [1], for TDX huge pages, you suggested pretending a to-shared conversion
> in kvm_gmem_punch_hole(). In that case, should we provide a new CONFIG_xxx to
> prevent it from being invoked by SNP?
No? That code was purely for demonstration purpose, I there was zero intent to
ever land it. The patch was tagged *** DO NOT MERGE *** for a reason :-)
> @@ -253,13 +294,18 @@ static long kvm_gmem_punch_hole(struct inode *inode, loff_t offset, loff_t len)
>
> kvm_gmem_invalidate_begin(inode, start, end);
>
> - truncate_inode_pages_range(inode->i_mapping, offset, offset + len - 1);
> + /*
> + * For demonstration purposes, pretend this is a private=>shared conversion.
> + */
> + r = kvm_gmem_convert(inode, start, end, false);
> + if (!r)
> + truncate_inode_pages_range(inode->i_mapping, offset, offset + len - 1);
>
> kvm_gmem_invalidate_end(inode, start, end);
>
> filemap_invalidate_unlock(inode->i_mapping);
>
> - return 0;
> + return r;
> }
> [1] https://lore.kernel.org/all/20260129011517.3545883-44-seanjc@google.com/
>
> Or would the following approach acceptable to you ? It renames .gmem_convert()
> to .gmem_prezap() and invokes it before each kvm_gmem_zap(), so TDX can hook it
> to perform page splitting before the actual zaps on private pages.
> Per my understanding, this op servers a different purpose from
> .gmem_make_private()/.gmem_make_shared() in this patch.
Isn't that just kvm_arch_gmem_invalidate_range()? Which was added to fix the
SNP VMSA mess. The only thing that's missing is graceful handling of failure.
next prev parent reply other threads:[~2026-07-23 18:47 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-09 20:49 [PATCH v4 00/18] KVM: SEV: Fix RMP #PF due to freeing in-use VMSA Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 01/18] KVM: SEV: Track the GPA of the guest-controlled VMSA used for SNP guests Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 02/18] KVM: SEV: Extract loading of guest-provided VMSA to a separate helper Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 03/18] KVM: SEV: Mark vCPU RUNNABLE after AP_CREATE, even if VMSA is unusable Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 04/18] KVM: SEV: Wire up kvm_x86_ops.gmem_xxx() if and only if CONFIG_KVM_AMD_SEV=y Sean Christopherson
2026-07-10 0:11 ` Ackerley Tng
2026-07-10 0:25 ` Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 05/18] KVM: x86: Serialize writes to disabled_quirks using kvm->lock Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 06/18] KVM: x86: Ensure runtime reads of disabled_quirks are resolved once Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 07/18] KVM: x86/mmu: Fold kvm_mmu_zap_memslot() into kvm_arch_flush_shadow_memslot() Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 08/18] KVM: x86/mmu: Split kvm_mmu_zap_all_fast() into "front" and "back" halves Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 09/18] KVM: x86/mmu: Use split "zap all fast" helpers when invalidating memslot Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 10/18] KVM: SEV: Forcefully invalidate SNP VMSA if its backing gmem page is zapped Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 11/18] KVM: SEV: Mark vCPU has having guest-provided VMSA even if its invalid Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 12/18] KVM: x86: Guard .gmem_prepare() declarations with HAVE_KVM_GMEM_PREPARE=y Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 13/18] KVM: guest_memfd: Pass GPA, not GFN, to prepare() hook Sean Christopherson
2026-07-10 0:36 ` Ackerley Tng
2026-07-10 22:08 ` Sean Christopherson
2026-07-10 22:43 ` Ackerley Tng
2026-07-10 23:44 ` Sean Christopherson
2026-07-13 22:28 ` Ackerley Tng
2026-07-14 0:00 ` Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 14/18] KVM: guest_memfd: Drop the redundant printk on arch gmem_prepare() failure Sean Christopherson
2026-07-10 0:18 ` Ackerley Tng
2026-07-09 20:49 ` [PATCH v4 15/18] KVM: guest_memfd: Fold __kvm_gmem_prepare_folio() into its sole caller Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 16/18] KVM: guest_memfd: Explicitly pass number of pages to kvm_arch_gmem_prepare() Sean Christopherson
2026-07-10 0:23 ` Ackerley Tng
2026-07-09 20:49 ` [PATCH v4 17/18] KVM: guest_memfd: Align the gfn as well as the pfn when "preparing" a folio Sean Christopherson
2026-07-09 20:49 ` [PATCH v4 18/18] KVM: guest_memfd: Combine .gmem_prepare()+.gmem_invalidate() into .gmem_convert() Sean Christopherson
2026-07-10 0:34 ` Ackerley Tng
2026-07-12 19:05 ` Fuad Tabba
2026-07-13 15:41 ` Ackerley Tng
2026-07-13 18:57 ` Fuad Tabba
2026-07-13 19:56 ` Sean Christopherson
2026-07-15 7:52 ` Yan Zhao
2026-07-21 18:57 ` Sean Christopherson
2026-07-22 2:18 ` Yan Zhao
2026-07-23 18:47 ` Sean Christopherson [this message]
2026-07-24 2:19 ` Yan Zhao
2026-07-14 18:40 ` [PATCH v4 00/18] KVM: SEV: Fix RMP #PF due to freeing in-use VMSA Sean Christopherson
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=amJhzgyQMVNVD1S3@google.com \
--to=seanjc@google.com \
--cc=ackerleytng@google.com \
--cc=imv4bel@gmail.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michael.roth@amd.com \
--cc=pbonzini@redhat.com \
--cc=tabba@google.com \
--cc=thomas.lendacky@amd.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