From: Sean Christopherson <seanjc@google.com>
To: Ackerley Tng <ackerleytng@google.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>
Subject: Re: [PATCH v4 13/18] KVM: guest_memfd: Pass GPA, not GFN, to prepare() hook
Date: Mon, 13 Jul 2026 17:00:46 -0700 [thread overview]
Message-ID: <alV8LlCuRQ1aDv5O@google.com> (raw)
In-Reply-To: <CAEvNRgEJrq4RXyKDOKMaubHHcbhkh1Rpu3p_6w4X0D0KDjzhcw@mail.gmail.com>
On Mon, Jul 13, 2026, Ackerley Tng wrote:
> Sean Christopherson <seanjc@google.com> writes:
> >> Maybe INVALID_GPA and INVALID_GFN should be defined such that both
> >> gpa_to_gfn and gfn_to_gpa are correct for both.
> >
> > Oh, _that_ was actually what I almost broke. I was going to track the gfn instead
> > of the gpa, and then do:
> >
> > svm->sev_es.snp_guest_vmsa_gfn = INVALID_GFN;
> >
> > ...
> >
> > gpa = gfn_to_gpa(svm->sev_es.snp_guest_vmsa_gfn);
> >
> > if (gpa == INVALID_GPA)
> > return;
> >
> > That would have failed miserably, because even if if INVALID_GFN is -1ull, the
> > lower bits would be zero after the shift, i.e. wouldn't match INVALID_GPA.
> >
> > I _think_ make that work, by doing something like:
> >
> > #define INVALID_GFN ((~(gfn_t)0) >> PAGE_SHIFT)
> > #define INVALID_GPA ((gpa_t)INVALID_GFN << PAGE_SHIFT)
> >
> > Which I actually don't mind conceptually, but I'm still not sure it's a good
> > idea in practice. For whatever reason, converting between INVALID_GFN and
> > INVALID_GPA just feels wrong.
>
> The above isn't a conversion, it's picking/defining sentinel values that
> are dependent on each other :)
My point is that the entire reason the sential values need to be dependent on
each other is that if we add INVALID_GFN, then KVM will inevitably convert
INVALID_GFN to a gpa and check the result against INVALID_GPA.
> > if (to_private) {
> > if (WARN_ON_ONCE(!kvm || gfn >> (kvm_host.maxphyaddr - PAGE_SIZE)))
> > return -EIO;
> >
> > return sev_gmem_make_private(kvm, gfn, pfn, nr_pages, order);
> > }
> >
> > Then in kvm_gmem_free_folio(), open code -1ull for the gfn:
> >
> > WARN_ON_ONCE(kvm_arch_gmem_convert(NULL, -1ull,
> > folio_file_pfn(folio, 0),
> > folio_nr_pages(folio),
> > folio_order(folio), false));
> >
> > Which is all a little gross? But I think it's less gross than passing a gpa, and
> > we don't risk delaying this and the in-place conversion series trying to find the
> > perfect answer.
>
> Yes thanks, we should go ahead with the GFN version, we can definitely
> update this later, if at all.
>
> I have some more questions, though not blocking:
>
> + I didn't notice that NULL was passed here. Is this kind of leaking SNP
> details into guest_memfd, that SNP doesn't need to know which kvm it
> is to convert a page to shared? Or is it that in principle converting
> to shared means "removing from ANY VM" and hence kvm = NULL?
Neither? It's saying "there's no VM at this point", because there's not. And
I wouldn't consider that an SNP detail, because any CoCo implementation has to
work that way in practice. Requiring an active VM to reclaim memory for host
usage would be unusable.
> + Is the purpose of checking for the bit being set to set up a contract?
No, it's to harden against against screwing things up in the futures. And the
check isn't against the C-bit, it's against the max legal gfn KVM supports, which
just so happens to have implications with respect to the C-bit.
> It's better than passing gpa, but TDX has the opposite definition for
> the bit, with 1 == shared. TDX doesn't use this callback so that's
> fine, but it's hard even for SNP to check since IIUC with VTOM 1 ==
> shared? What if we just not check and depend only on kvm == NULL?
Because the to_private path requires a valid gfn
> How about this: as a lifecycle callback, guest_memfd calling this
> function should be saying "guest_memfd is doing a conversion of nr_pages
> beginning at this pfn to shared/private, and by the way here's the kvm
> and gfn since I have the information." (all arguments presented if
> available) and SNP says "I'll take action, for to_shared I don't need
> kvm or gfn" (just ignore kvm and gfn for to_shared conversions)
No? That's more or less what I proposed, except I guess for "by the way, here's
the kvm and gfn" for to_shared. Because I do NOT think we should walk all bindings
to find the kvm+gfn pairs, and because I think we should firmly establish that
to_private requires a kvm+gfn pair, and to_shared does not. As above, in pracitce,
that needs to hold true for any CoCo VM.
next prev parent reply other threads:[~2026-07-14 0:00 UTC|newest]
Thread overview: 46+ 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 21:07 ` sashiko-bot
2026-07-10 0:28 ` 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 21:06 ` sashiko-bot
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 21:10 ` sashiko-bot
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 21:06 ` sashiko-bot
2026-07-10 0:30 ` 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 [this message]
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 21:11 ` sashiko-bot
2026-07-10 0:32 ` 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-09 21:12 ` sashiko-bot
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 21:15 ` sashiko-bot
2026-07-10 0:29 ` Ackerley Tng
2026-07-10 0:33 ` 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
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=alV8LlCuRQ1aDv5O@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 \
/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.