All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: Jim Mattson <jmattson@google.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	Thomas Gleixner <tglx@kernel.org>, Ingo Molnar <mingo@redhat.com>,
	 Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	x86@kernel.org,  "H. Peter Anvin" <hpa@zytor.com>,
	Shuah Khan <shuah@kernel.org>,
	kvm@vger.kernel.org,  linux-kernel@vger.kernel.org,
	linux-kselftest@vger.kernel.org,  Yosry Ahmed <yosry@kernel.org>
Subject: Re: [PATCH v5 09/10] KVM: x86: nSVM: Handle restore of legacy nested state
Date: Tue, 3 Mar 2026 09:32:13 -0800	[thread overview]
Message-ID: <aacbHcUbG5WYgSaQ@google.com> (raw)
In-Reply-To: <20260224005500.1471972-10-jmattson@google.com>

On Mon, Feb 23, 2026, Jim Mattson wrote:
> @@ -2075,9 +2076,15 @@ static int svm_set_nested_state(struct kvm_vcpu *vcpu,
>  
>  	svm_switch_vmcb(svm, &svm->nested.vmcb02);
>  
> -	if (nested_npt_enabled(svm) &&
> -	    (kvm_state->hdr.svm.flags & KVM_STATE_SVM_VALID_GPAT))
> -		vmcb_set_gpat(svm->vmcb, kvm_state->hdr.svm.gpat);
> +	svm->nested.legacy_gpat_semantics =
> +		nested_npt_enabled(svm) &&
> +		!(kvm_state->hdr.svm.flags & KVM_STATE_SVM_VALID_GPAT);
> +	if (nested_npt_enabled(svm)) {
> +		u64 g_pat = svm->nested.legacy_gpat_semantics ?
> +			    vcpu->arch.pat : kvm_state->hdr.svm.gpat;

This is all a bit gnarly, e.g. the indentation and wrapping, as well as the logic
(not that it's wrong, just a bit hard to follow the chain of events).

Rather than set legacy_gpat_semantics directly, what if we clear it by default,
and then set it %true in the exact path where KVM uses legacy semantics.

	svm->nested.legacy_gpat_semantics = false;
	if (nested_npt_enabled(svm)) {
		if (kvm_state->hdr.svm.flags & KVM_STATE_SVM_VALID_GPAT) {
			vmcb_set_gpat(svm->vmcb, kvm_state->hdr.svm.gpat);
		} else {
			svm->nested.legacy_gpat_semantics = true;
			vmcb_set_gpat(svm->vmcb, vcpu->arch.pat);
		}
	}

As a bonus, if the previous patch is deliberately "bad" and does:

	if (nested_npt_enabled(svm)) {
		if (kvm_state->hdr.svm.flags & KVM_STATE_SVM_VALID_GPAT)
			vmcb_set_gpat(svm->vmcb, kvm_state->hdr.svm.gpat);
	}

then the diff for this snippet shrinks to:

@@ -2025,9 +2026,14 @@ static int svm_set_nested_state(struct kvm_vcpu *vcpu,
 
        svm_switch_vmcb(svm, &svm->nested.vmcb02);
 
+       svm->nested.legacy_gpat_semantics = false;
        if (nested_npt_enabled(svm)) {
-               if (kvm_state->hdr.svm.flags & KVM_STATE_SVM_VALID_GPAT)
+               if (kvm_state->hdr.svm.flags & KVM_STATE_SVM_VALID_GPAT) {
                        vmcb_set_gpat(svm->vmcb, kvm_state->hdr.svm.gpat);
+               } else {
+                       svm->nested.legacy_gpat_semantics = true;
+                       vmcb_set_gpat(svm->vmcb, vcpu->arch.pat);
+               }
        }
 
        nested_vmcb02_prepare_control(svm);

> +
> +		vmcb_set_gpat(svm->nested.vmcb02.ptr, g_pat);

I don't like the switch from svm->vmcb to svm->nested.vmcb02.ptr.  For better or
worse, the existing code uses svm->vmcb, so I think it makes sense to use that.
If we want to explicitly use vmcb02, then we should capture svm->nested.vmcb02.ptr
locally as vmcb02 (in a future cleanup patch).


> +	}
>  
>  	nested_vmcb02_prepare_control(svm, svm->vmcb->save.rip, svm->vmcb->save.cs.base);
>  
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index 00dba10991a5..ac45702f566e 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -2727,7 +2727,8 @@ static bool svm_pat_accesses_gpat(struct kvm_vcpu *vcpu, bool from_host)
>  	 * with older kernels.
>  	 */
>  	WARN_ON_ONCE(from_host && vcpu->wants_to_run);
> -	return !from_host && is_guest_mode(vcpu) && nested_npt_enabled(svm);
> +	return !svm->nested.legacy_gpat_semantics && !from_host &&
> +		is_guest_mode(vcpu) && nested_npt_enabled(svm);

Align indentation (it's a shame return wasn't spelled retturn, it would save many
spaces).

  reply	other threads:[~2026-03-03 17:32 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-24  0:54 [PATCH v5 00/10] KVM: x86: nSVM: Improve PAT virtualization Jim Mattson
2026-02-24  0:54 ` [PATCH v5 01/10] KVM: x86: SVM: Remove vmcb_is_dirty() Jim Mattson
2026-02-24  0:54 ` [PATCH v5 02/10] KVM: x86: nSVM: Clear VMCB_NPT clean bit when updating hPAT from guest mode Jim Mattson
2026-02-24  0:54 ` [PATCH v5 03/10] KVM: x86: nSVM: Cache and validate vmcb12 g_pat Jim Mattson
2026-02-24  0:54 ` [PATCH v5 04/10] KVM: x86: nSVM: Set vmcb02.g_pat correctly for nested NPT Jim Mattson
2026-02-24  0:54 ` [PATCH v5 05/10] KVM: x86: nSVM: Redirect IA32_PAT accesses to either hPAT or gPAT Jim Mattson
2026-02-24 17:43   ` Sean Christopherson
2026-02-24 18:18     ` Jim Mattson
2026-02-24 19:04     ` Yosry Ahmed
2026-02-24  0:54 ` [PATCH v5 06/10] KVM: x86: Remove common handling of MSR_IA32_CR_PAT Jim Mattson
2026-02-24  0:54 ` [PATCH v5 07/10] KVM: x86: nSVM: Save gPAT to vmcb12.g_pat on VMEXIT Jim Mattson
2026-02-24  0:54 ` [PATCH v5 08/10] KVM: x86: nSVM: Save/restore gPAT with KVM_{GET,SET}_NESTED_STATE Jim Mattson
2026-03-04 17:11   ` Sean Christopherson
2026-03-04 18:37     ` Jim Mattson
2026-03-04 19:11       ` Sean Christopherson
2026-03-04 19:35         ` Yosry Ahmed
2026-03-04 19:55           ` Sean Christopherson
2026-03-05 18:49             ` Jim Mattson
2026-02-24  0:54 ` [PATCH v5 09/10] KVM: x86: nSVM: Handle restore of legacy nested state Jim Mattson
2026-03-03 17:32   ` Sean Christopherson [this message]
2026-02-24  0:54 ` [PATCH v5 10/10] KVM: selftests: nSVM: Add svm_nested_pat test Jim Mattson
2026-03-05 17:08 ` [PATCH v5 00/10] KVM: x86: nSVM: Improve PAT virtualization 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=aacbHcUbG5WYgSaQ@google.com \
    --to=seanjc@google.com \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=jmattson@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=shuah@kernel.org \
    --cc=tglx@kernel.org \
    --cc=x86@kernel.org \
    --cc=yosry@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.