From: Sean Christopherson <seanjc@google.com>
To: Ackerley Tng <ackerleytng@google.com>
Cc: Lisa Wang <wyihan@google.com>,
Andrew Jones <ajones@ventanamicro.com>,
Binbin Wu <binbin.wu@linux.intel.com>,
Chao Gao <chao.gao@intel.com>,
Chenyi Qiang <chenyi.qiang@intel.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
Erdem Aktas <erdemaktas@google.com>,
Ira Weiny <ira.weiny@intel.com>,
Isaku Yamahata <isaku.yamahata@intel.com>,
Kiryl Shutsemau <kas@kernel.org>,
linux-kselftest@vger.kernel.org,
Paolo Bonzini <pbonzini@redhat.com>,
"Pratik R. Sampat" <pratikrajesh.sampat@amd.com>,
Reinette Chatre <reinette.chatre@intel.com>,
Rick Edgecombe <rick.p.edgecombe@intel.com>,
Roger Wang <runanwang@google.com>,
Ryan Afranji <afranji@google.com>,
Sagi Shahar <sagis@google.com>, Shuah Khan <shuah@kernel.org>,
Oliver Upton <oupton@kernel.org>,
Jeremiah McReynolds <jmcrey@google.com>,
kvm@vger.kernel.org, linux-coco@lists.linux.dev,
linux-kernel@vger.kernel.org, x86@kernel.org
Subject: Re: [PATCH v13 19/22] KVM: selftests: Finalize TD memory as part of kvm_arch_vm_finalize_vcpus
Date: Tue, 16 Jun 2026 07:36:31 -0700 [thread overview]
Message-ID: <ajFfb9u6dU47Nj3v@google.com> (raw)
In-Reply-To: <CAEvNRgHjno=XDnMpTvZcNCR6D5RAi1rbynrL4CnnEa7Y-M3VLg@mail.gmail.com>
On Mon, Jun 15, 2026, Ackerley Tng wrote:
> Sean Christopherson <seanjc@google.com> writes:
>
> > On Fri, Jun 05, 2026, Ackerley Tng wrote:
> >> Sean Christopherson <seanjc@google.com> writes:
> >> Many tests use vm_userspace_mem_region_add(), CoCo tests that require
> >> finalizing shouldn't be disallowed that option.
> >
> > What does that have to do with finalizing the VM?
>
> I could add more memslots after finalizing the VM, but then I'd have to
> make the guest accept more memory. Hence, I'd rather set up all the
> memslots and then finalize the VM.
Why? It's not like the performance of this code matters terribly.
Regardless, nothing *requires* a test to go down that route. As I said before,
my goal with the selftests infrastructure is to effectively optimize the entire
experience, i.e. to provide default behavior that works well for the majority of
tests. Attempting to provide default behavior that perfectly fits *every* test
is simply impossible.
> sev_smoke_test currently has a separate vm_sev_launch(), which is the
> equivalent of tdx_init_mem_region(), and that's called in the tests
> themselves.
>
> sev_smoke_test also uses vcpu_args_set() after creating the VM with
> vm_create_shape_with_one_vcpu(). Would that work if vm_sev_launch() got
> moved into kvm_arch_vm_finalize_vcpus()?
No, because vCPU state would be encrypted at that point. Moving vm_sev_launch()
would also break test_sev_dbg(), which sets a global buffer to all 0xaa prior to
encrypting that data.
> >> >> It's also possible to have some kvm_vm_finalize() call that can be
> >> >> explicitly and manually invoked from selftests just for CoCo selftests.
> >> >
> >> > Why bother? It's obviously possible to all kvm_arch_vm_finalize_vcpus() directly.
> >>
> >> Works for me to call directly. Do you mean kvm_arch_vm_finalize_vcpus()
> >> is the right function where the TD is finalized?
> >>
> >> For tests that need to do more setup after creating a vm, is the only
> >> way out to call __vm_create() then vm_vcpu_add() to avoid premature
> >> finalization in __vm_create_with_vcpus() when
> >> kvm_arch_vm_finalize_vcpus() is called?
> >
> > Depends on what you're doing. Sometimes, the answer will be yes. That's why
> > there are "low level" APIs, so that some tests can do fancy things, while most
> > tests can leave the details to the infrastructure.
> >
> > If there's a recurring problem, or we anticipate one, then we can and should
> > figure out how to minimize the pain so that tests don't have to deal with the
> > same boilerplate issues over and over. Hence the __shared idea.
>
> I still think kvm_arch_vm_finalize_vcpus() is an odd place to be
> finalizing the VM.
That's literally why the function exists though. The one and only existing
implementation (on arm64) uses it to initialize the vGIC.
void kvm_arch_vm_finalize_vcpus(struct kvm_vm *vm)
{
if (vm->arch.has_gic)
__vgic_v3_init(vm->arch.gic_fd);
}
That's *very* similar to the proposed TDX usage, where some per-VM asset(s) can
be initialized/frozen only after all vCPUs have been added. In other words, the
name is describing where in the VM creation/setup flow the hook is called, and
perhaps more importantly, the impact of the call: vCPUs are finalized (obviously
with a different definition of "finalized" based on the VM properties).
> I would prefer to not have to explicitly call some function like
> kvm_arch_vm_finalize() (no vcpu in the name), but a common arch function
> calling vm_sev_launch() and tdx_vm_finalize() is what I can think of
> for test setup flexibility, without too much magic.
We can't have our cake and eat it too. Either we launch/finalize SEV/TDX VMs as
part of the common VM creation flows (as proposed for TDX), or we force tests to
manually launch/finalize the VM after additional setup. The only way to have it
both ways is to utilize crazy macro shenanigans to execute arbitrary code between
creating the VM and launching/finalizing the VM, and even I would balk at that.
I honestly don't see any reason to try to figure out which of the two approaches
is optimal at this time. Whatever decision we make isn't set in stone, and in
fact should be relative easy to change. And without being able to see all the
TDX/SEV tests that are waiting in the wings, it's more or less impossible to make
an informed decision.
I definitely want to have SEV and TDX use the same core approach in the end, but
I don't think we should force the issue right now, because the cost of reworking
the SEV and/or TDX infrastructure when there are only a bare handful of tests is
so low. It will cost more to try to predict the future of a 50/50 outcome than
it will to make a completely wild guess between the two options and rework things
if we guess wrong.
> For now, I can't think of many uses of __shared. ucall shared memory is
> allocated dynamically, and we can also make it shared cleanly within
> ucall code.
Uh, every selftest that uses global variables to communicate between guest and
host?
> The global variables (sync_global_to_guest()) will appear in the guest
> as long as sync_global_to_guest() is called before
> kvm_arch_vm_finalize(), which I think makes sense to people writing
> tests for CoCo.
Yes, but that's completely orthogonal to all of this.
> So 2 questions to push this along:
>
> 1. What do you think of a kvm_arch_vm_finalize() that calls
> vm_sev_launch() and tdx_vm_finalize()? My key issue is that
> kvm_arch_vm_finalize_*vcpus*() seems to be for finalizing vCPUs
> rather than the whole VM.
Key word "seems". I'm pretty sure Oliver picked kvm_arch_vm_finalize_vcpus() as
the name in commit 8911c7dbc607 ("KVM: arm64: selftests: Create a VGICv3 for
'default' VMs") for the same reasons I think it's a good fit for coco VMs: like
finalizing TDX VMs, initializing the vGIC effectively finalizes vCPUs.
We could rename it to kvm_arch_vm_finalize(), but that won't change the fact that
we'll need to decide between automagic vs. manual finalization, and it definitely
should be a separate discussion.
> 3. Would you like __shared implemented together with this series, as a
> prerequisite, or later?
Only if __shared is a hard requirement for base TDX support, which I assume is
not the case.
next prev parent reply other threads:[~2026-06-16 14:36 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-21 23:16 [PATCH v13 00/22] TDX KVM selftests Lisa Wang
2026-05-21 23:16 ` [PATCH v13 01/22] KVM: selftests: Add macros to simplify creating VM shapes for non-default types Lisa Wang
2026-06-16 8:57 ` Xiaoyao Li
2026-06-16 16:51 ` Sean Christopherson
2026-05-21 23:16 ` [PATCH v13 02/22] KVM: selftests: Update kvm_init_vm_address_properties() for TDX Lisa Wang
2026-05-21 23:16 ` [PATCH v13 03/22] KVM: selftests: Initialize the TDX VM Lisa Wang
2026-06-08 5:57 ` Binbin Wu
2026-06-15 23:33 ` Lisa Wang
2026-05-21 23:16 ` [PATCH v13 04/22] KVM: selftests: TDX: Use KVM_TDX_CAPABILITIES to validate TDs' attribute configuration Lisa Wang
2026-05-21 23:16 ` [PATCH v13 05/22] KVM: selftests: Expose segment definitions to assembly files Lisa Wang
2026-05-21 23:16 ` [PATCH v13 06/22] tools: include: Add kbuild.h for assembly structure offsets Lisa Wang
2026-06-08 6:12 ` Binbin Wu
2026-05-21 23:16 ` [PATCH v13 07/22] KVM: selftests: Introduce structures for TDX guest boot parameters Lisa Wang
2026-05-22 17:43 ` Yosry Ahmed
2026-05-22 23:05 ` Sean Christopherson
2026-05-22 23:50 ` Yosry Ahmed
2026-05-28 19:25 ` Yosry Ahmed
2026-05-21 23:16 ` [PATCH v13 08/22] KVM: selftests: Add TDX boot code Lisa Wang
2026-06-16 9:21 ` Chenyi Qiang
2026-05-21 23:16 ` [PATCH v13 09/22] KVM: selftests: Expose functions to get default sregs values Lisa Wang
2026-06-08 6:39 ` Binbin Wu
2026-06-15 10:54 ` Chenyi Qiang
2026-05-21 23:16 ` [PATCH v13 10/22] KVM: selftests: Set up TDX boot code region Lisa Wang
2026-05-21 23:16 ` [PATCH v13 11/22] KVM: selftests: Set up TDX boot parameters region Lisa Wang
2026-06-08 7:23 ` Binbin Wu
2026-05-21 23:16 ` [PATCH v13 12/22] KVM: selftests: Back the first memory region with guest_memfd for TDX Lisa Wang
2026-06-08 7:31 ` Binbin Wu
2026-05-21 23:16 ` [PATCH v13 13/22] KVM: selftests: Set first memory region as shared if guest_memfd Lisa Wang
2026-06-08 8:03 ` Binbin Wu
2026-06-16 0:04 ` Lisa Wang
2026-06-15 23:46 ` Ackerley Tng
2026-05-21 23:16 ` [PATCH v13 14/22] KVM: selftests: Expose function to allocate vCPU stack Lisa Wang
2026-05-21 23:16 ` [PATCH v13 15/22] KVM: selftests: Call KVM_TDX_INIT_VCPU when creating a new TDX vcpu Lisa Wang
2026-06-08 8:34 ` Binbin Wu
2026-05-21 23:16 ` [PATCH v13 16/22] KVM: selftests: Load per-vCPU guest stack in TDX boot parameters Lisa Wang
2026-06-09 5:37 ` Binbin Wu
2026-05-21 23:16 ` [PATCH v13 17/22] KVM: selftests: Set entry point for TDX guest code Lisa Wang
2026-05-21 23:16 ` [PATCH v13 18/22] KVM: selftests: Add helpers to init TDX memory and finalize VM Lisa Wang
2026-05-21 23:17 ` [PATCH v13 19/22] KVM: selftests: Finalize TD memory as part of kvm_arch_vm_finalize_vcpus Lisa Wang
2026-06-05 13:58 ` Ackerley Tng
2026-06-05 17:58 ` Sean Christopherson
2026-06-05 18:27 ` Ackerley Tng
2026-06-05 20:48 ` Sean Christopherson
2026-06-16 0:26 ` Ackerley Tng
2026-06-16 14:36 ` Sean Christopherson [this message]
2026-06-16 16:13 ` Ackerley Tng
2026-06-16 17:06 ` Sean Christopherson
2026-05-21 23:17 ` [PATCH v13 20/22] KVM: selftests: Implement MMIO WRITE for the TDX VM Lisa Wang
2026-06-09 6:45 ` Binbin Wu
2026-06-16 18:20 ` Sean Christopherson
2026-05-21 23:17 ` [PATCH v13 21/22] KVM: selftests: Add ucall support for TDX Lisa Wang
2026-06-16 18:47 ` Sean Christopherson
2026-05-21 23:17 ` [PATCH v13 22/22] KVM: selftests: Add TDX lifecycle test Lisa Wang
2026-06-16 17:51 ` [PATCH v13 00/22] TDX KVM selftests Ackerley Tng
2026-06-16 18:48 ` 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=ajFfb9u6dU47Nj3v@google.com \
--to=seanjc@google.com \
--cc=ackerleytng@google.com \
--cc=afranji@google.com \
--cc=ajones@ventanamicro.com \
--cc=binbin.wu@linux.intel.com \
--cc=chao.gao@intel.com \
--cc=chenyi.qiang@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=erdemaktas@google.com \
--cc=ira.weiny@intel.com \
--cc=isaku.yamahata@intel.com \
--cc=jmcrey@google.com \
--cc=kas@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=oupton@kernel.org \
--cc=pbonzini@redhat.com \
--cc=pratikrajesh.sampat@amd.com \
--cc=reinette.chatre@intel.com \
--cc=rick.p.edgecombe@intel.com \
--cc=runanwang@google.com \
--cc=sagis@google.com \
--cc=shuah@kernel.org \
--cc=wyihan@google.com \
--cc=x86@kernel.org \
/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.