All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maxim Levitsky <mlevitsk@redhat.com>
To: Sean Christopherson <seanjc@google.com>, Wei Huang <wei.huang2@amd.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	vkuznets@redhat.com, wanpengli@tencent.com, jmattson@google.com,
	joro@8bytes.org, tglx@linutronix.de, mingo@redhat.com,
	bp@alien8.de, x86@kernel.org, hpa@zytor.com
Subject: Re: [PATCH v3 0/3] SVM 5-level page table support
Date: Mon, 23 Aug 2021 21:10:46 +0300	[thread overview]
Message-ID: <e5b8b03e1079b6f7f36edb7695a48021b9a0a936.camel@redhat.com> (raw)
In-Reply-To: <YSPIgBNiMZkwAOSG@google.com>

On Mon, 2021-08-23 at 16:10 +0000, Sean Christopherson wrote:
> On Mon, Aug 23, 2021, Wei Huang wrote:
> > On 08/23 12:20, Maxim Levitsky wrote:
> > > This hack makes it work again for me (I don't yet use TDP mmu).
> > > 
> > > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> > > index caa3f9aee7d1..c25e0d40a620 100644
> > > --- a/arch/x86/kvm/mmu/mmu.c
> > > +++ b/arch/x86/kvm/mmu/mmu.c
> > > @@ -3562,7 +3562,7 @@ static int mmu_alloc_special_roots(struct kvm_vcpu *vcpu)
> > >             mmu->shadow_root_level < PT64_ROOT_4LEVEL)
> > >                 return 0;
> > >  
> > > -       if (mmu->pae_root && mmu->pml4_root && mmu->pml5_root)
> 
> Maxim, I assume you hit this WARN and bail?
Yep.
> 
>         if (WARN_ON_ONCE(!tdp_enabled || mmu->pae_root || mmu->pml4_root ||
>                          mmu->pml5_root))
> 		return -EIO;
> 
> Because as the comment states, KVM expects all the special roots to be allocated
> together.  The 5-level paging supported breaks that assumption because pml5_root
> will be allocated iff the host is using 5-level paging.
> 
>         if (mmu->shadow_root_level > PT64_ROOT_4LEVEL) {
>                 pml5_root = (void *)get_zeroed_page(GFP_KERNEL_ACCOUNT);
>                 if (!pml5_root)
>                         goto err_pml5;
>         }
> 
> I think this is the least awful fix, I'll test and send a proper patch later today.
> 
> diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> index 4853c033e6ce..93b2ed422b48 100644
> --- a/arch/x86/kvm/mmu/mmu.c
> +++ b/arch/x86/kvm/mmu/mmu.c
> @@ -3548,6 +3548,7 @@ static int mmu_alloc_shadow_roots(struct kvm_vcpu *vcpu)
>  static int mmu_alloc_special_roots(struct kvm_vcpu *vcpu)
>  {
>         struct kvm_mmu *mmu = vcpu->arch.mmu;
> +       bool need_pml5 = mmu->shadow_root_level > PT64_ROOT_4LEVEL;
>         u64 *pml5_root = NULL;
>         u64 *pml4_root = NULL;
>         u64 *pae_root;
> @@ -3562,7 +3563,14 @@ static int mmu_alloc_special_roots(struct kvm_vcpu *vcpu)
>             mmu->shadow_root_level < PT64_ROOT_4LEVEL)
>                 return 0;
> 
> -       if (mmu->pae_root && mmu->pml4_root && mmu->pml5_root)
> +       /*
> +        * NPT, the only paging mode that uses this horror, uses a fixed number
> +        * of levels for the shadow page tables, e.g. all MMUs are 4-level or
> +        * all MMus are 5-level.  Thus, this can safely require that pml5_root
> +        * is allocated if the other roots are valid and pml5 is needed, as any
> +        * prior MMU would also have required pml5.
> +        */
> +       if (mmu->pae_root && mmu->pml4_root && (!need_pml5 || mmu->pml5_root))
>                 return 0;
> 
>         /*
> @@ -3570,7 +3578,7 @@ static int mmu_alloc_special_roots(struct kvm_vcpu *vcpu)
>          * bail if KVM ends up in a state where only one of the roots is valid.
>          */
>         if (WARN_ON_ONCE(!tdp_enabled || mmu->pae_root || mmu->pml4_root ||
> -                        mmu->pml5_root))
> +                        (need_pml5 && mmu->pml5_root)))
>                 return -EIO;
> 
>         /*
> 
> > > +       if (mmu->pae_root && mmu->pml4_root)
> > >                 return 0;
> > >  
> > >         /*

Makes sense, works, and without digging too much into this
I expected this to be fixed by something like that, so:

Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>

Thanks,
Best regards,
	Maxim Levitsky



> > > 
> > > 
> > > 
> > > Best regards,
> > > 	Maxim Levitsky
> > > 



  reply	other threads:[~2021-08-23 18:11 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-18 16:55 [PATCH v3 0/3] SVM 5-level page table support Wei Huang
2021-08-18 16:55 ` [PATCH v3 1/3] KVM: x86: Allow CPU to force vendor-specific TDP level Wei Huang
2021-08-18 16:55 ` [PATCH v3 2/3] KVM: x86: Handle the case of 5-level shadow page table Wei Huang
2021-08-18 17:15   ` Sean Christopherson
2021-08-19 16:36     ` Paolo Bonzini
2021-08-18 18:00   ` Tom Lendacky
2021-08-18 16:55 ` [PATCH v3 3/3] KVM: SVM: Add 5-level page table support for SVM Wei Huang
2021-08-18 17:32   ` Sean Christopherson
2021-08-19 16:38     ` Paolo Bonzini
2021-08-19 16:43 ` [PATCH v3 0/3] SVM 5-level page table support Paolo Bonzini
2021-08-23  9:20   ` Maxim Levitsky
2021-08-23 15:15     ` Wei Huang
2021-08-23 16:10       ` Sean Christopherson
2021-08-23 18:10         ` Maxim Levitsky [this message]
2021-08-23 18:06       ` Maxim Levitsky

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=e5b8b03e1079b6f7f36edb7695a48021b9a0a936.camel@redhat.com \
    --to=mlevitsk@redhat.com \
    --cc=bp@alien8.de \
    --cc=hpa@zytor.com \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=seanjc@google.com \
    --cc=tglx@linutronix.de \
    --cc=vkuznets@redhat.com \
    --cc=wanpengli@tencent.com \
    --cc=wei.huang2@amd.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.