From: Sean Christopherson <seanjc@google.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
vkuznets@redhat.com, mlevitsk@redhat.com, dmatlack@google.com
Subject: Re: [PATCH 08/12] KVM: MMU: do not consult levels when freeing roots
Date: Fri, 11 Feb 2022 00:41:16 +0000 [thread overview]
Message-ID: <YgWwrG+EQgTwyt8v@google.com> (raw)
In-Reply-To: <20220209170020.1775368-9-pbonzini@redhat.com>
On Wed, Feb 09, 2022, Paolo Bonzini wrote:
> Right now, PGD caching requires a complicated dance of first computing
> the MMU role and passing it to __kvm_mmu_new_pgd, and then separately calling
Nit, adding () after function names helps readers easily recognize when you're
taking about a specific function, e.g. as opposed to a concept or whatever.
> kvm_init_mmu.
>
> Part of this is due to kvm_mmu_free_roots using mmu->root_level and
> mmu->shadow_root_level to distinguish whether the page table uses a single
> root or 4 PAE roots. Because kvm_init_mmu can overwrite mmu->root_level,
> kvm_mmu_free_roots must be called before kvm_init_mmu.
>
> However, even after kvm_init_mmu there is a way to detect whether the page table
> has a single root or four, because the pae_root does not have an associated
> struct kvm_mmu_page.
Suggest a reword on the final paragraph, because there's a discrepancy with the
code (which handles 0, 1, or 4 "roots", versus just "single or four").
However, even after kvm_init_mmu() there is a way to detect whether the
page table may hold PAE roots, as root.hpa isn't backed by a shadow when
it points at PAE roots.
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> arch/x86/kvm/mmu/mmu.c | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> index 3c3f597ea00d..95d0fa0bb876 100644
> --- a/arch/x86/kvm/mmu/mmu.c
> +++ b/arch/x86/kvm/mmu/mmu.c
> @@ -3219,12 +3219,15 @@ void kvm_mmu_free_roots(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
> struct kvm *kvm = vcpu->kvm;
> int i;
> LIST_HEAD(invalid_list);
> - bool free_active_root = roots_to_free & KVM_MMU_ROOT_CURRENT;
> + bool free_active_root;
>
> BUILD_BUG_ON(KVM_MMU_NUM_PREV_ROOTS >= BITS_PER_LONG);
>
> /* Before acquiring the MMU lock, see if we need to do any real work. */
> - if (!(free_active_root && VALID_PAGE(mmu->root.hpa))) {
> + free_active_root = (roots_to_free & KVM_MMU_ROOT_CURRENT)
> + && VALID_PAGE(mmu->root.hpa);
free_active_root = (roots_to_free & KVM_MMU_ROOT_CURRENT) &&
VALID_PAGE(mmu->root.hpa);
Isn't this a separate bug fix? E.g. call kvm_mmu_unload() without a valid current
root, but with valid previous roots? In which case we'd try to free garbage, no?
> +
> + if (!free_active_root) {
> for (i = 0; i < KVM_MMU_NUM_PREV_ROOTS; i++)
> if ((roots_to_free & KVM_MMU_ROOT_PREVIOUS(i)) &&
> VALID_PAGE(mmu->prev_roots[i].hpa))
> @@ -3242,8 +3245,7 @@ void kvm_mmu_free_roots(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
> &invalid_list);
>
> if (free_active_root) {
> - if (mmu->shadow_root_level >= PT64_ROOT_4LEVEL &&
> - (mmu->root_level >= PT64_ROOT_4LEVEL || mmu->direct_map)) {
> + if (to_shadow_page(mmu->root.hpa)) {
> mmu_free_root_page(kvm, &mmu->root.hpa, &invalid_list);
> } else if (mmu->pae_root) {
> for (i = 0; i < 4; ++i) {
> --
> 2.31.1
>
>
next prev parent reply other threads:[~2022-02-11 0:41 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-09 17:00 [PATCH 00/12] KVM: MMU: do not unload MMU roots on all role changes Paolo Bonzini
2022-02-09 17:00 ` [PATCH 01/12] KVM: x86: host-initiated EFER.LME write affects the MMU Paolo Bonzini
2022-02-10 22:49 ` Sean Christopherson
2022-02-09 17:00 ` [PATCH 02/12] KVM: MMU: move MMU role accessors to header Paolo Bonzini
2022-02-10 23:00 ` Sean Christopherson
2022-02-09 17:00 ` [PATCH 03/12] KVM: x86: do not deliver asynchronous page faults if CR0.PG=0 Paolo Bonzini
2022-02-10 23:10 ` Sean Christopherson
2022-02-10 23:14 ` Sean Christopherson
2022-02-10 23:16 ` Sean Christopherson
2022-02-11 11:16 ` Paolo Bonzini
2022-02-09 17:00 ` [PATCH 04/12] KVM: MMU: WARN if PAE roots linger after kvm_mmu_unload Paolo Bonzini
2022-02-10 23:20 ` Sean Christopherson
2022-02-11 11:18 ` Paolo Bonzini
2022-02-09 17:00 ` [PATCH 05/12] KVM: MMU: avoid NULL-pointer dereference on page freeing bugs Paolo Bonzini
2022-02-11 0:24 ` Sean Christopherson
2022-02-11 11:21 ` Paolo Bonzini
2022-02-09 17:00 ` [PATCH 06/12] KVM: MMU: rename kvm_mmu_reload Paolo Bonzini
2022-02-11 0:27 ` Sean Christopherson
2022-02-11 10:07 ` Paolo Bonzini
2022-02-11 16:16 ` Sean Christopherson
2022-02-11 16:52 ` Paolo Bonzini
2022-02-09 17:00 ` [PATCH 07/12] KVM: x86: use struct kvm_mmu_root_info for mmu->root Paolo Bonzini
2022-02-11 17:39 ` Sean Christopherson
2022-02-09 17:00 ` [PATCH 08/12] KVM: MMU: do not consult levels when freeing roots Paolo Bonzini
2022-02-11 0:41 ` Sean Christopherson [this message]
2022-02-11 0:54 ` Sean Christopherson
2022-02-11 1:07 ` Paolo Bonzini
2022-02-11 1:35 ` Sean Christopherson
2022-02-11 1:44 ` Sean Christopherson
2022-02-11 2:20 ` Sean Christopherson
2022-02-09 17:00 ` [PATCH 09/12] KVM: MMU: look for a cached PGD when going from 32-bit to 64-bit Paolo Bonzini
2022-02-11 1:32 ` Sean Christopherson
2022-02-11 1:37 ` Sean Christopherson
2022-02-11 10:09 ` Paolo Bonzini
2022-02-11 11:45 ` Paolo Bonzini
2022-02-11 17:38 ` Sean Christopherson
2022-02-09 17:00 ` [PATCH 10/12] KVM: MMU: load new PGD after the shadow MMU is initialized Paolo Bonzini
2022-02-11 17:45 ` Sean Christopherson
2022-02-11 17:47 ` Paolo Bonzini
2022-02-09 17:00 ` [PATCH 11/12] KVM: MMU: remove kvm_mmu_calc_root_page_role Paolo Bonzini
2022-02-11 17:53 ` Sean Christopherson
2022-02-09 17:00 ` [PATCH 12/12] KVM: x86: do not unload MMU roots on all role changes Paolo Bonzini
2022-02-11 9:08 ` Nikunj A. Dadhania
2022-02-11 18:48 ` Sean Christopherson
2022-02-14 16:34 ` Paolo Bonzini
2022-02-14 19:24 ` Sean Christopherson
2022-02-15 8:17 ` Paolo Bonzini
2022-02-09 17:07 ` [PATCH 00/12] KVM: MMU: " Sean Christopherson
2022-02-09 17:11 ` Paolo Bonzini
2022-02-09 17:16 ` 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=YgWwrG+EQgTwyt8v@google.com \
--to=seanjc@google.com \
--cc=dmatlack@google.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mlevitsk@redhat.com \
--cc=pbonzini@redhat.com \
--cc=vkuznets@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.