From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>
Cc: Sean Christopherson <seanjc@google.com>,
Wanpeng Li <wanpengli@tencent.com>,
Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Ben Gardon <bgardon@google.com>,
Richard Herbert <rherbert@sympatico.ca>
Subject: Re: [PATCH 4/4] KVM: x86/mmu: Optimize not-present/MMIO SPTE check in get_mmio_spte()
Date: Fri, 18 Dec 2020 10:33:47 +0100 [thread overview]
Message-ID: <87lfdvtq4k.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <20201218003139.2167891-5-seanjc@google.com>
Sean Christopherson <seanjc@google.com> writes:
> Check only the terminal leaf for a "!PRESENT || MMIO" SPTE when looking
> for reserved bits on valid, non-MMIO SPTEs. The get_walk() helpers
> terminate their walks if a not-present or MMIO SPTE is encountered, i.e.
> the non-terminal SPTEs have already been verified to be regular SPTEs.
> This eliminates an extra check-and-branch in a relatively hot loop.
>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> ---
> arch/x86/kvm/mmu/mmu.c | 20 +++++++++++++-------
> 1 file changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> index 4798a4472066..769855f5f0a1 100644
> --- a/arch/x86/kvm/mmu/mmu.c
> +++ b/arch/x86/kvm/mmu/mmu.c
> @@ -3511,7 +3511,7 @@ static int get_walk(struct kvm_vcpu *vcpu, u64 addr, u64 *sptes, int *root_level
> return leaf;
> }
>
> -/* return true if reserved bit is detected on spte. */
> +/* return true if reserved bit(s) are detected on a valid, non-MMIO SPTE. */
> static bool get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr, u64 *sptep)
> {
> u64 sptes[PT64_ROOT_MAX_LEVEL + 1];
> @@ -3534,11 +3534,20 @@ static bool get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr, u64 *sptep)
> return reserved;
> }
>
> + *sptep = sptes[leaf];
> +
> + /*
> + * Skip reserved bits checks on the terminal leaf if it's not a valid
> + * SPTE. Note, this also (intentionally) skips MMIO SPTEs, which, by
> + * design, always have reserved bits set. The purpose of the checks is
> + * to detect reserved bits on non-MMIO SPTEs. i.e. buggy SPTEs.
> + */
> + if (!is_shadow_present_pte(sptes[leaf]))
> + leaf++;
> +
> rsvd_check = &vcpu->arch.mmu->shadow_zero_check;
>
> - for (level = root; level >= leaf; level--) {
> - if (!is_shadow_present_pte(sptes[level]))
> - break;
> + for (level = root; level >= leaf; level--)
> /*
> * Use a bitwise-OR instead of a logical-OR to aggregate the
> * reserved bit and EPT's invalid memtype/XWR checks to avoid
> @@ -3546,7 +3555,6 @@ static bool get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr, u64 *sptep)
> */
> reserved |= __is_bad_mt_xwr(rsvd_check, sptes[level]) |
> __is_rsvd_bits_set(rsvd_check, sptes[level], level);
> - }
>
> if (reserved) {
> pr_err("%s: detect reserved bits on spte, addr 0x%llx, dump hierarchy:\n",
> @@ -3556,8 +3564,6 @@ static bool get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr, u64 *sptep)
> sptes[level], level);
> }
>
> - *sptep = sptes[leaf];
> -
> return reserved;
> }
FWIW (as I got a bit lost in tdp-mmu code when checking that
is_shadow_present_pte() is always performed)
Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
--
Vitaly
next prev parent reply other threads:[~2020-12-18 9:35 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-18 0:31 [PATCH 0/4] KVM: x86/mmu: Bug fixes and cleanups in get_mmio_spte() Sean Christopherson
2020-12-18 0:31 ` [PATCH 1/4] KVM: x86/mmu: Use -1 to flag an undefined spte " Sean Christopherson
2020-12-18 8:58 ` Vitaly Kuznetsov
2020-12-21 17:05 ` Sean Christopherson
2020-12-18 0:31 ` [PATCH 2/4] KVM: x86/mmu: Get root level from walkers when retrieving MMIO SPTE Sean Christopherson
2020-12-18 9:10 ` Vitaly Kuznetsov
2020-12-21 18:24 ` Paolo Bonzini
2020-12-21 18:30 ` Sean Christopherson
2020-12-18 0:31 ` [PATCH 3/4] KVM: x86/mmu: Use raw level to index into MMIO walks' sptes array Sean Christopherson
2020-12-18 9:18 ` Vitaly Kuznetsov
2020-12-18 0:31 ` [PATCH 4/4] KVM: x86/mmu: Optimize not-present/MMIO SPTE check in get_mmio_spte() Sean Christopherson
2020-12-18 9:33 ` Vitaly Kuznetsov [this message]
[not found] ` <2346556.XAFRqVoOGU@starbug.dom>
2020-12-18 1:27 ` [PATCH 0/4] KVM: x86/mmu: Bug fixes and cleanups " Richard Herbert
2020-12-21 18:26 ` 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=87lfdvtq4k.fsf@vitty.brq.redhat.com \
--to=vkuznets@redhat.com \
--cc=bgardon@google.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=rherbert@sympatico.ca \
--cc=seanjc@google.com \
--cc=wanpengli@tencent.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.