From: Paolo Bonzini <pbonzini@redhat.com>
To: Sean Christopherson <seanjc@google.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH 3/4] KVM: nSVM: invalidate cached PDPTRs across nested NPT transitions
Date: Thu, 28 May 2026 10:33:06 +0200 [thread overview]
Message-ID: <bfc136b4-106b-41dc-a161-b39ca8d63161@redhat.com> (raw)
In-Reply-To: <aheD8XjfMrL9wGFa@google.com>
On 5/28/26 01:53, Sean Christopherson wrote:
> I would rather use kvm_clear_available_registers() than add yet another API,
> which isn't even a good fit here since SVM never expects the PDPTRs to be dirty.
>
> Though I think it's a moot point, because nSVM should be clearing *all*
> lazy-loaded registers. It just so happens that PDPTRs are the only such "register".
>
> I haven't checked to see if this would actually be correct, I'm just mimicking
> the nVMX code. But conceptually, I think we want something like so:
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index e74fcde6155e..0c6ab00766b1 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -1303,6 +1303,8 @@ void svm_switch_vmcb(struct vcpu_svm *svm, struct kvm_vmcb_info *target_vmcb)
> {
> svm->current_vmcb = target_vmcb;
> svm->vmcb = target_vmcb->ptr;
> +
> + kvm_clear_available_registers(&svm->vcpu, SVM_REGS_LAZY_LOAD_SET);
> }
>
> static int svm_vcpu_precreate(struct kvm *kvm)
I actually started with something like that. nSVM should indeed be
clearing all other lazy-loaded registers too (except there isn't any).
I ended up doing it the other way for two reasons, both boiling down to
PDPTRs being weird.
First, the PDPTRs are cached processor state but not a field of the
VMCB; changing the VMCB should have no effect on them. For SVM, changes
to their cache state are purely a result of writes to CR3 or CR4.PAE.
Thus it seemed more explicit to single out the PAE+nNPT case when
loading CR3:
if (nested_npt)
kvm_register_mark_for_reload
else if (!load_pdptrs(...))
return -EINVAL;
instead of the slightly more opaque
if (!nested_npt && !load_pdptrs(...))
return -EINVAL;
Second, with nNPT it's not even entirely correct to cache them at all.
Strictly speaking they should never even be marked available, that way
you'd go through load_pdptrs() on every PAE memory access. Thus
kvm_register_mark_for_reload() could also be tied to the CR4 write, but
in any case not to the VMCB switch.
I'd rather keep it like this but yeah, it can be done either way. If
there were other registers in the lazy load set, relying on
svm_switch_vmcb() would make sense but you'd want to add a comment above
the two instances of "if (!nested_npt && !load_pdptrs())".
Paolo
next prev parent reply other threads:[~2026-05-28 8:33 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-27 12:05 [PATCH 0/4] KVM: x86: small MMU-adjacent cleanups Paolo Bonzini
2026-05-27 12:05 ` [PATCH 1/4] KVM: x86: remove nested_mmu from mmu_is_nested() Paolo Bonzini
2026-05-27 12:05 ` [PATCH 2/4] KVM: nVMX: remove unnecessary code in prepare_vmcs02 Paolo Bonzini
2026-05-28 0:14 ` Sean Christopherson
2026-05-28 7:56 ` Paolo Bonzini
2026-05-27 12:05 ` [PATCH 3/4] KVM: nSVM: invalidate cached PDPTRs across nested NPT transitions Paolo Bonzini
2026-05-27 23:53 ` Sean Christopherson
2026-05-28 8:33 ` Paolo Bonzini [this message]
2026-05-28 18:33 ` Jim Mattson
2026-05-30 16:54 ` Paolo Bonzini
2026-05-27 12:06 ` [PATCH 4/4] KVM: x86: check that kvm_handle_invpcid is only invoked with shadow paging Paolo Bonzini
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=bfc136b4-106b-41dc-a161-b39ca8d63161@redhat.com \
--to=pbonzini@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=seanjc@google.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
all inboxes | Powered by JetHome®