From: Sean Christopherson <seanjc@google.com>
To: Xiaoyao Li <xiaoyao.li@intel.com>
Cc: Rick P Edgecombe <rick.p.edgecombe@intel.com>,
"sashiko-reviews@lists.linux.dev"
<sashiko-reviews@lists.linux.dev>,
"pbonzini@redhat.com" <pbonzini@redhat.com>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>
Subject: Re: [PATCH v3 3/4] KVM: TDX: Don't assume exit_reason[31:16] as all-0 in tdx_to_vmx_exit_reason()
Date: Mon, 17 Aug 2026 11:19:16 -0700 [thread overview]
Message-ID: <aoNQpP-BQKiZL47O@google.com> (raw)
In-Reply-To: <d67eb097-1223-4b68-92d4-1510d3d7be7c@intel.com>
On Mon, Aug 17, 2026, Xiaoyao Li wrote:
> On 8/14/2026 11:12 PM, Sean Christopherson wrote:
> > On Fri, Aug 14, 2026, Xiaoyao Li wrote:
> > > On 8/14/2026 7:44 AM, Sean Christopherson wrote:
> > > > On Wed, Aug 12, 2026, Rick P Edgecombe wrote:
> > > > > Side note. I really dislike how tangled this area is for something that seems
> > > > > like it should be much more straightforward. Deriving partially I think from the
> > > > > overloading of the TDVMCALL leafs with the exit reasons. So we have things like:
> > > > > ...
> > > > > case EXIT_REASON_EPT_VIOLATION:
> > > > > return EXIT_REASON_EPT_MISCONFIG;
> > > > > ...
> > > >
> > > > I peeked at that code again, and FWIW I still think swizzling the exit_reason for
> > > > TDVMCALL is the least awful solution. If we don't do that, then we'll have to
> > > > update every single use of the exit_reason to demux TDVMCALL into the "real" exit
> > > > reason, which will be a mess.
> > >
> > > I'm not sure if you read my idea[1]?
> > >
> > > I think there is only one place KVM cares about the exit_reason TDVMCALL,
> > > just the
> > >
> > > case EXIT_REASON_TDCALL:
> >
> > No, the massaged exit_reason is also subtley consumed via trace_kvm_exit().
>
> yeah. This is exactly the one I don't like, it looks like trace_kvm_exit()
> is tracing the wrong exit reason, though it is by intentional.
>
> > It's also consumed by tdx_complete_emulated_msr():
> >
> > if (vmx_get_exit_reason(vcpu).basic == EXIT_REASON_MSR_READ)
> >
> > and by tdx_interrupt_allowed()
> >
> > return vmx_get_exit_reason(vcpu).basic != EXIT_REASON_HLT ||
> > !to_tdx(vcpu)->vp_enter_args.r12;
> >
> > and by tdx_protected_apic_has_interrupt():
> >
> > if (vmx_get_exit_reason(vcpu).basic != EXIT_REASON_HLT ||
> > to_tdx(vcpu)->vp_enter_args.r12)
> > return false;
>
> Ah, I really should have checked the code more carefully.
>
> > > in tdx_handle_exit().
> > > [1]
> > > https://lore.kernel.org/all/646f9595-459f-4224-b4e5-4ec2eecc0bc6@intel.com/
> > > > And once we track the exit_reason separately from vp_enter_ret, IMO it all becomes
> > > > more logical and easier to follow. vp_enter_ret holds the information about why
> > > > VP.ENTER returned/exited, while exit_reason holds information about why the _guest_
> > > > exited. Obviously it's imperfect since we're still fudging EXIT_REASON_EPT_MISCONFIG,
> > > > but again, I think that's a better alternative than demuxing exit_reason in multiple
> > > > locations.
> > >
> > > The question do we really need to swizzle EXIT_REASON_TDCALL to other exit
> > > reasons ahead? why cannot them just be handled in the central handler for
> > > EXIT_REASON_TDCALL?
> >
> > Because as above, it's not as central as you think. If we want to not swizzle
> > the exit_reason, then IMO the only sane way to do that is to not track exit_reason
> > for TDX vCPUs, i.e. move vcpu_vt.exit_reason back to vcpu_vmx and force TDX to
> > always demux vp_enter_ret every time.
>
> How about adding a specific field to track the TDVMCALL leaf? Full diff as
> below (the EPT MISCONFIG part can be split into a separate one)
I like it even less than demuxing vp_enter_ret on demand. It has all the same
flaws as demuxing vp_enter_ret, because it's effectively just a cache of the
result of demuxing vp_enter_ret. And caching values on entry/exit boundaries
adds additional risk; I can point you at a number of bugs in the past where KVM
consumed stale data, e.g. because some chunk of code got moved to run before a
cached field was refreshed. That's unlikekly to be a problem here, but anytime
data is cached it introduces risk of consuming stale data.
And the cost of demuxing vp_enter_ret every time doesn't concern me, at all.
What I don't like is relying on call sites to know that the exit_reason needs to
be demuxed in the first place, because that will be brittle and error prone.
That's why I'd be ok if vcpu_vt.exit_reason simply didn't exist: it becomes
impossible to check the wrong exit field because there's only one such field.
I'm ok caching the fully processed vcpu_vt.exit_reason, i.e. with the code now,
because only the TDVMCALL path needs to be aware that it may have undergone
processing, *and* KVM can WARN if that processing didn't happen as expected.
Whereas checking the "right" exit reason requires doing so in multiple paths and
doesn't have a natural sanity check.
next prev parent reply other threads:[~2026-08-17 18:19 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-12 8:02 [PATCH v3 0/4] KVM: TDX: Enable VM-DoS Prevention Features for TDX Xiaoyao Li
2026-08-12 8:02 ` [PATCH v3 1/4] KVM: TDX: Enable Notify VM exit Xiaoyao Li
2026-08-12 8:02 ` [PATCH v3 2/4] KVM: TDX: Set bits 31:16 to 0 for the synthesized Exit Reason Xiaoyao Li
2026-08-12 21:58 ` Edgecombe, Rick P
2026-08-12 8:02 ` [PATCH v3 3/4] KVM: TDX: Don't assume exit_reason[31:16] as all-0 in tdx_to_vmx_exit_reason() Xiaoyao Li
2026-08-12 8:23 ` sashiko-bot
2026-08-12 9:07 ` Xiaoyao Li
2026-08-12 22:55 ` Edgecombe, Rick P
2026-08-13 23:44 ` Sean Christopherson
2026-08-14 1:02 ` Xiaoyao Li
2026-08-14 15:12 ` Sean Christopherson
2026-08-17 2:49 ` Xiaoyao Li
2026-08-17 18:19 ` Sean Christopherson [this message]
2026-08-13 0:14 ` Sean Christopherson
2026-08-13 8:42 ` Xiaoyao Li
2026-08-12 8:02 ` [PATCH v3 4/4] KVM: TDX: Enable Bus Lock VM exit Xiaoyao Li
2026-08-12 8:20 ` sashiko-bot
2026-08-12 9:11 ` Xiaoyao Li
2026-08-13 0:06 ` Sean Christopherson
2026-08-12 22:58 ` Edgecombe, Rick P
2026-08-13 11:17 ` Xiaoyao Li
2026-08-13 14:43 ` Sean Christopherson
2026-08-14 0:49 ` Xiaoyao Li
2026-08-14 15:46 ` Sean Christopherson
2026-08-15 13:28 ` Xiaoyao Li
2026-08-17 18:06 ` 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=aoNQpP-BQKiZL47O@google.com \
--to=seanjc@google.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=rick.p.edgecombe@intel.com \
--cc=sashiko-reviews@lists.linux.dev \
--cc=xiaoyao.li@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 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.