From: Lai Jiangshan <jiangshanlai@gmail.com>
To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
Paolo Bonzini <pbonzini@redhat.com>
Cc: Lai Jiangshan <laijs@linux.alibaba.com>,
Sean Christopherson <seanjc@google.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Wanpeng Li <wanpengli@tencent.com>,
Jim Mattson <jmattson@google.com>, Joerg Roedel <joro@8bytes.org>,
Thomas Gleixner <tglx@linutronix.de>,
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>
Subject: [PATCH 4/4] KVM: X86: Only get rflags when needed in permission_fault()
Date: Tue, 7 Dec 2021 17:50:39 +0800 [thread overview]
Message-ID: <20211207095039.53166-5-jiangshanlai@gmail.com> (raw)
In-Reply-To: <20211207095039.53166-1-jiangshanlai@gmail.com>
From: Lai Jiangshan <laijs@linux.alibaba.com>
In same cases, it doesn't need to get rflags for SMAP checks.
For example: it is user mode access, it could have contained other
permission fault, SMAP is not enabled, it is implicit supervisor
access, or it is nested TDP pagetable.
Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com>
---
arch/x86/kvm/mmu.h | 34 ++++++++++++++++++++++------------
1 file changed, 22 insertions(+), 12 deletions(-)
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h
index 0cb2c52377c8..70ab6e392f18 100644
--- a/arch/x86/kvm/mmu.h
+++ b/arch/x86/kvm/mmu.h
@@ -252,8 +252,6 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
unsigned pte_access, unsigned pte_pkey,
unsigned pfec)
{
- unsigned long rflags = static_call(kvm_x86_get_rflags)(vcpu);
-
/*
* If explicit supervisor accesses, SMAP is disabled
* if EFLAGS.AC = 1.
@@ -261,22 +259,34 @@ static inline u8 permission_fault(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
* If implicit supervisor accesses, SMAP can not be disabled
* regardless of the value EFLAGS.AC.
*
- * SMAP works on supervisor accesses only, and not_smap can
+ * SMAP works on supervisor accesses only, and SMAP checking bit can
* be set or not set when user access with neither has any bearing
* on the result.
*
- * This computes explicit_access && (rflags & X86_EFLAGS_AC), leaving
- * the result in X86_EFLAGS_AC. We then insert it in place of
- * the PFERR_RSVD_MASK bit; this bit will always be zero in pfec,
- * but it will be one in index if SMAP checks are being overridden.
- * It is important to keep this branchless.
+ * We put the SMAP checking bit in place of the PFERR_RSVD_MASK bit;
+ * this bit will always be zero in pfec, but it will be one in index
+ * if SMAP checks are being disabled.
*/
- u32 not_smap = (rflags & X86_EFLAGS_AC) & vcpu->arch.explicit_access;
- int index = (pfec >> 1) +
- (not_smap >> (X86_EFLAGS_AC_BIT - PFERR_RSVD_BIT + 1));
- bool fault = (mmu->permissions[index] >> pte_access) & 1;
+ u32 fault = (mmu->permissions[pfec >> 1] >> pte_access) & 1;
+ int index = (pfec + PFERR_RSVD_MASK) >> 1;
+ u32 fault_not_smap = (mmu->permissions[index] >> pte_access) & 1;
u32 errcode = PFERR_PRESENT_MASK;
+ /*
+ * fault fault_not_smap
+ * 0 0 not fault here
+ * 0 1 impossible combination
+ * 1 0 check if implicit access or EFLAGS.AC
+ * 1 1 fault with non-SMAP permission fault
+ *
+ * It is common fault == fault_not_smap, and they are always
+ * equivalent when SMAP is not enabled.
+ */
+ if (unlikely(fault & ~fault_not_smap & vcpu->arch.explicit_access)) {
+ unsigned long rflags = static_call(kvm_x86_get_rflags)(vcpu);
+ fault = (rflags ^ X86_EFLAGS_AC) >> X86_EFLAGS_AC_BIT;
+ }
+
WARN_ON(pfec & (PFERR_PK_MASK | PFERR_RSVD_MASK));
if (unlikely(mmu->pkru_mask)) {
u32 pkru_bits, offset;
--
2.19.1.6.gb485710b
next prev parent reply other threads:[~2021-12-07 9:51 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-07 9:50 [PATCH 0/4] KVM: X86: Improve permission_fault() for SMAP Lai Jiangshan
2021-12-07 9:50 ` [PATCH 1/4] KVM: X86: Fix comments in update_permission_bitmask Lai Jiangshan
2021-12-07 9:50 ` [PATCH 2/4] KVM: X86: Rename variable smap to not_smap in permission_fault() Lai Jiangshan
2021-12-07 9:50 ` [PATCH 3/4] KVM: X86: Handle implicit supervisor access with SMAP Lai Jiangshan
2021-12-07 21:52 ` Sean Christopherson
2021-12-07 23:30 ` Lai Jiangshan
2021-12-08 9:12 ` Paolo Bonzini
2021-12-07 9:50 ` Lai Jiangshan [this message]
2021-12-07 21:57 ` [PATCH 4/4] KVM: X86: Only get rflags when needed in permission_fault() 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=20211207095039.53166-5-jiangshanlai@gmail.com \
--to=jiangshanlai@gmail.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=laijs@linux.alibaba.com \
--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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®