All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org
Subject: Re: [PATCH 16/22] KVM: x86/mmu: remove redundant bits from extended role
Date: Thu, 12 May 2022 21:34:04 +0000	[thread overview]
Message-ID: <Yn19TPJgdrzDLmbf@google.com> (raw)
In-Reply-To: <8c92f44f-3e56-5a5d-76c2-b50b8fe58b3d@redhat.com>

On Thu, May 12, 2022, Paolo Bonzini wrote:
> On 5/12/22 16:18, Sean Christopherson wrote:
> > On Thu, May 12, 2022, Paolo Bonzini wrote:
> > > On 5/10/22 02:20, Sean Christopherson wrote:
> > > > --
> > > > From: Sean Christopherson<seanjc@google.com>
> > > > Date: Mon, 9 May 2022 17:13:39 -0700
> > > > Subject: [PATCH] KVM: x86/mmu: Return true from is_cr4_pae() iff CR0.PG is set
> > > > 
> > > > Condition is_cr4_pae() on is_cr0_pg() in addition to the !4-byte gPTE
> > > > check.  From the MMU's perspective, PAE is disabling if paging is
> > > > disabled.  The current code works because all callers check is_cr0_pg()
> > > > before invoking is_cr4_pae(), but relying on callers to maintain that
> > > > behavior is unnecessarily risky.
> > > > 
> > > > Fixes: faf729621c96 ("KVM: x86/mmu: remove redundant bits from extended role")
> > > > Signed-off-by: Sean Christopherson<seanjc@google.com>
> > > > ---
> > > >    arch/x86/kvm/mmu/mmu.c | 2 +-
> > > >    1 file changed, 1 insertion(+), 1 deletion(-)
> > > > 
> > > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> > > > index 909372762363..d1c20170a553 100644
> > > > --- a/arch/x86/kvm/mmu/mmu.c
> > > > +++ b/arch/x86/kvm/mmu/mmu.c
> > > > @@ -240,7 +240,7 @@ static inline bool is_cr0_pg(struct kvm_mmu *mmu)
> > > > 
> > > >    static inline bool is_cr4_pae(struct kvm_mmu *mmu)
> > > >    {
> > > > -        return !mmu->cpu_role.base.has_4_byte_gpte;
> > > > +        return is_cr0_pg(mmu) && !mmu->cpu_role.base.has_4_byte_gpte;
> > > >    }
> > > > 
> > > >    static struct kvm_mmu_role_regs vcpu_to_role_regs(struct kvm_vcpu *vcpu)
> > > 
> > > Hmm, thinking more about it this is not needed for two kind of opposite
> > > reasons:
> > > 
> > > * if is_cr4_pae() really were to represent the raw CR4.PAE value, this is
> > > incorrect and it should be up to the callers to check is_cr0_pg()
> > > 
> > > * if is_cr4_pae() instead represents 8-byte page table entries, then it does
> > > even before this patch, because of the following logic in
> > > kvm_calc_cpu_role():
> > > 
> > >          if (!____is_cr0_pg(regs)) {
> > >                  role.base.direct = 1;
> > >                  return role;
> > >          }
> > > 	...
> > >          role.base.has_4_byte_gpte = !____is_cr4_pae(regs);
> > > 
> > > 
> > > So whatever meaning we give to is_cr4_pae(), there is no need for the
> > > adjustment.
> > 
> > I disagree, because is_cr4_pae() doesn't represent either of those things.  It
> > represents the effective (not raw) CR4.PAE from the MMU's perspective.
> 
> Doh, you're right that has_4_byte_gpte is actually 0 if CR0.PG=0. Swapping
> stuff back is hard.
> 
> What do you think about a WARN_ON_ONCE(!is_cr0_pg(mmu))?

Why bother?  WARN and continue would be rather silly as we'd knowingly let KVM
do something wrong for no benefit.  And this

	return !WARN_ON_ONCE(!is_cr0_pg(mmu)) && !role.base.has_4_byte_gpte;

feels wrong because there's nothing fundamentally broke with calling is_cr4_pae()
without first checking CR0.PG.

If you really want to avoid the is_cr0_pg() check, why not just use has_4_byte_gpte
directly?  Logically I think that's easy enough to follow, e.g. 64 bits == 8 bytes,
32 bits == 4 bytes.  We can always revisit the need for is_cr4_pae() if the MMU
needs to identify PAE paging for some reason, e.g. for PDPTR awareness.

diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index 909372762363..b05190027e20 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -238,11 +238,6 @@ static inline bool is_cr0_pg(struct kvm_mmu *mmu)
         return mmu->cpu_role.base.level > 0;
 }

-static inline bool is_cr4_pae(struct kvm_mmu *mmu)
-{
-        return !mmu->cpu_role.base.has_4_byte_gpte;
-}
-
 static struct kvm_mmu_role_regs vcpu_to_role_regs(struct kvm_vcpu *vcpu)
 {
        struct kvm_mmu_role_regs regs = {
@@ -4855,7 +4850,7 @@ static void init_kvm_tdp_mmu(struct kvm_vcpu *vcpu,

        if (!is_cr0_pg(context))
                context->gva_to_gpa = nonpaging_gva_to_gpa;
-       else if (is_cr4_pae(context))
+       else if (!context->cpu_role.base.has_4_byte_gpte)
                context->gva_to_gpa = paging64_gva_to_gpa;
        else
                context->gva_to_gpa = paging32_gva_to_gpa;
@@ -4877,7 +4872,7 @@ static void shadow_mmu_init_context(struct kvm_vcpu *vcpu, struct kvm_mmu *conte

        if (!is_cr0_pg(context))
                nonpaging_init_context(context);
-       else if (is_cr4_pae(context))
+       else if (!context->cpu_role.base.has_4_byte_gpte)
                paging64_init_context(context);
        else
                paging32_init_context(context);


  reply	other threads:[~2022-05-12 21:34 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-14  7:39 [PATCH v3 00/22] https://www.spinics.net/lists/kvm/msg267878.html Paolo Bonzini
2022-04-14  7:39 ` [PATCH 01/22] KVM: x86/mmu: nested EPT cannot be used in SMM Paolo Bonzini
2022-04-14  7:39 ` [PATCH 02/22] KVM: x86/mmu: constify uses of struct kvm_mmu_role_regs Paolo Bonzini
2022-04-14  7:39 ` [PATCH 03/22] KVM: x86/mmu: pull computation of kvm_mmu_role_regs to kvm_init_mmu Paolo Bonzini
2022-04-14  7:39 ` [PATCH 04/22] KVM: x86/mmu: rephrase unclear comment Paolo Bonzini
2022-04-14  7:39 ` [PATCH 05/22] KVM: x86: Clean up and document nested #PF workaround Paolo Bonzini
2022-04-14  7:39 ` [PATCH 06/22] KVM: x86/mmu: remove "bool base_only" arguments Paolo Bonzini
2022-04-14  7:39 ` [PATCH 07/22] KVM: x86/mmu: split cpu_role from mmu_role Paolo Bonzini
2022-04-15  4:16   ` Like Xu
2022-04-14  7:39 ` [PATCH 08/22] KVM: x86/mmu: do not recompute root level from kvm_mmu_role_regs Paolo Bonzini
2022-04-14  7:39 ` [PATCH 09/22] KVM: x86/mmu: remove ept_ad field Paolo Bonzini
2022-04-14  7:39 ` [PATCH 10/22] KVM: x86/mmu: remove kvm_calc_shadow_root_page_role_common Paolo Bonzini
2022-04-14  7:39 ` [PATCH 11/22] KVM: x86/mmu: cleanup computation of MMU roles for two-dimensional paging Paolo Bonzini
2022-04-14  7:39 ` [PATCH 12/22] KVM: x86/mmu: cleanup computation of MMU roles for shadow paging Paolo Bonzini
2022-04-14  7:39 ` [PATCH 13/22] KVM: x86/mmu: store shadow EFER.NX in the MMU role Paolo Bonzini
2022-04-14  7:39 ` [PATCH 14/22] KVM: x86/mmu: remove extended bits from mmu_role, rename field Paolo Bonzini
2022-04-14  7:39 ` [PATCH 15/22] KVM: x86/mmu: rename kvm_mmu_role union Paolo Bonzini
2022-04-14  7:39 ` [PATCH 16/22] KVM: x86/mmu: remove redundant bits from extended role Paolo Bonzini
2022-04-14  8:27   ` Paolo Bonzini
2022-05-10  0:20   ` Sean Christopherson
2022-05-11 13:53     ` Paolo Bonzini
2022-05-12 13:59     ` Paolo Bonzini
2022-05-12 14:18       ` Sean Christopherson
2022-05-12 16:09         ` Paolo Bonzini
2022-05-12 21:34           ` Sean Christopherson [this message]
2022-04-14  7:39 ` [PATCH 17/22] KVM: x86/mmu: remove valid " Paolo Bonzini
2022-04-14  7:39 ` [PATCH 18/22] KVM: x86/mmu: simplify and/or inline computation of shadow MMU roles Paolo Bonzini
2022-04-14  7:39 ` [PATCH 19/22] KVM: x86/mmu: pull CPU mode computation to kvm_init_mmu Paolo Bonzini
2022-04-14  7:39 ` [PATCH 20/22] KVM: x86/mmu: replace shadow_root_level with root_role.level Paolo Bonzini
2022-04-14  7:39 ` [PATCH 21/22] KVM: x86/mmu: replace root_level with cpu_role.base.level Paolo Bonzini
2022-04-14  7:40 ` [PATCH 22/22] KVM: x86/mmu: replace direct_map with root_role.direct Paolo Bonzini
2022-04-14  7:47 ` [PATCH v3 00/22] https://www.spinics.net/lists/kvm/msg267878.html Paolo Bonzini
2022-04-14 15:02   ` Sean Christopherson
2022-04-14 15:09     ` 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=Yn19TPJgdrzDLmbf@google.com \
    --to=seanjc@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pbonzini@redhat.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.