All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mohammed Gamal <mgamal@redhat.com>
To: kvm@vger.kernel.org, pbonzini@redhat.com
Cc: linux-kernel@vger.kernel.org, vkuznets@redhat.com,
	sean.j.christopherson@intel.com, wanpengli@tencent.com,
	jmattson@google.com, joro@8bytes.org
Subject: [PATCH v3 6/9] KVM: VMX: introduce vmx_need_pf_intercept
Date: Fri, 10 Jul 2020 17:48:08 +0200	[thread overview]
Message-ID: <20200710154811.418214-7-mgamal@redhat.com> (raw)
In-Reply-To: <20200710154811.418214-1-mgamal@redhat.com>

From: Paolo Bonzini <pbonzini@redhat.com>

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 arch/x86/kvm/vmx/nested.c | 28 +++++++++++++++++-----------
 arch/x86/kvm/vmx/vmx.c    |  2 +-
 arch/x86/kvm/vmx/vmx.h    |  5 +++++
 3 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
index b26655104d4a..1aea9e3b8c43 100644
--- a/arch/x86/kvm/vmx/nested.c
+++ b/arch/x86/kvm/vmx/nested.c
@@ -2433,22 +2433,28 @@ static void prepare_vmcs02_rare(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12)
 
 	/*
 	 * Whether page-faults are trapped is determined by a combination of
-	 * 3 settings: PFEC_MASK, PFEC_MATCH and EXCEPTION_BITMAP.PF.
-	 * If enable_ept, L0 doesn't care about page faults and we should
-	 * set all of these to L1's desires. However, if !enable_ept, L0 does
-	 * care about (at least some) page faults, and because it is not easy
-	 * (if at all possible?) to merge L0 and L1's desires, we simply ask
-	 * to exit on each and every L2 page fault. This is done by setting
-	 * MASK=MATCH=0 and (see below) EB.PF=1.
+	 * 3 settings: PFEC_MASK, PFEC_MATCH and EXCEPTION_BITMAP.PF.  If L0
+	 * doesn't care about page faults then we should set all of these to
+	 * L1's desires. However, if L0 does care about (some) page faults, it
+	 * is not easy (if at all possible?) to merge L0 and L1's desires, we
+	 * simply ask to exit on each and every L2 page fault. This is done by
+	 * setting MASK=MATCH=0 and (see below) EB.PF=1.
 	 * Note that below we don't need special code to set EB.PF beyond the
 	 * "or"ing of the EB of vmcs01 and vmcs12, because when enable_ept,
 	 * vmcs01's EB.PF is 0 so the "or" will take vmcs12's value, and when
 	 * !enable_ept, EB.PF is 1, so the "or" will always be 1.
 	 */
-	vmcs_write32(PAGE_FAULT_ERROR_CODE_MASK,
-		enable_ept ? vmcs12->page_fault_error_code_mask : 0);
-	vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH,
-		enable_ept ? vmcs12->page_fault_error_code_match : 0);
+	if (vmx_need_pf_intercept(&vmx->vcpu)) {
+		/*
+		 * TODO: if both L0 and L1 need the same MASK and MATCH,
+		 * go ahead and use it?
+		 */
+		vmcs_write32(PAGE_FAULT_ERROR_CODE_MASK, 0);
+		vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH, 0);
+	} else {
+		vmcs_write32(PAGE_FAULT_ERROR_CODE_MASK, vmcs12->page_fault_error_code_mask);
+		vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH, vmcs12->page_fault_error_code_match);
+	}
 
 	if (cpu_has_vmx_apicv()) {
 		vmcs_write64(EOI_EXIT_BITMAP0, vmcs12->eoi_exit_bitmap0);
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 178ee92551a9..770b090969fb 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -780,7 +780,7 @@ void update_exception_bitmap(struct kvm_vcpu *vcpu)
 		eb |= 1u << BP_VECTOR;
 	if (to_vmx(vcpu)->rmode.vm86_active)
 		eb = ~0;
-	if (enable_ept)
+	if (!vmx_need_pf_intercept(vcpu))
 		eb &= ~(1u << PF_VECTOR);
 
 	/* When we are running a nested L2 guest and L1 specified for it a
diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h
index 639798e4a6ca..b0e5e210f1c1 100644
--- a/arch/x86/kvm/vmx/vmx.h
+++ b/arch/x86/kvm/vmx/vmx.h
@@ -550,6 +550,11 @@ static inline bool vmx_has_waitpkg(struct vcpu_vmx *vmx)
 		SECONDARY_EXEC_ENABLE_USR_WAIT_PAUSE;
 }
 
+static inline bool vmx_need_pf_intercept(struct kvm_vcpu *vcpu)
+{
+	return !enable_ept;
+}
+
 void dump_vmcs(void);
 
 #endif /* __KVM_X86_VMX_H */
-- 
2.26.2


  parent reply	other threads:[~2020-07-10 15:48 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-10 15:48 [PATCH v3 0/9] KVM: Support guest MAXPHYADDR < host MAXPHYADDR Mohammed Gamal
2020-07-10 15:48 ` [PATCH v3 1/9] KVM: x86: Add helper functions for illegal GPA checking and page fault injection Mohammed Gamal
2020-07-10 15:48 ` [PATCH v3 2/9] KVM: x86: mmu: Move translate_gpa() to mmu.c Mohammed Gamal
2020-07-10 15:48 ` [PATCH v3 3/9] KVM: x86: mmu: Add guest physical address check in translate_gpa() Mohammed Gamal
2020-07-10 17:41   ` Paolo Bonzini
2020-07-10 15:48 ` [PATCH v3 4/9] KVM: x86: rename update_bp_intercept to update_exception_bitmap Mohammed Gamal
2020-07-10 16:15   ` Jim Mattson
2020-07-10 15:48 ` [PATCH v3 5/9] KVM: x86: update exception bitmap on CPUID changes Mohammed Gamal
2020-07-10 16:25   ` Jim Mattson
2020-07-10 15:48 ` Mohammed Gamal [this message]
2020-07-10 15:48 ` [PATCH v3 7/9] KVM: VMX: Add guest physical address check in EPT violation and misconfig Mohammed Gamal
2020-07-13 18:32   ` Sean Christopherson
2020-07-15 23:00   ` Sean Christopherson
2020-08-17 17:22     ` Sean Christopherson
2020-08-17 18:01       ` Paolo Bonzini
2020-10-09 16:17   ` Jim Mattson
2020-10-14 23:44     ` Jim Mattson
2020-10-23  3:14       ` Sean Christopherson
2020-10-23  9:22         ` Paolo Bonzini
2020-10-23 16:59           ` Jim Mattson
2020-10-23 17:16             ` Paolo Bonzini
2020-10-23 17:23               ` Jim Mattson
2020-10-23 17:43                 ` Paolo Bonzini
2021-01-15 19:35                   ` Jim Mattson
2021-01-20 21:16                     ` Jim Mattson
2021-01-27 20:57                       ` Jim Mattson
2021-06-21 18:31                         ` Jim Mattson
2020-07-10 15:48 ` [PATCH v3 8/9] KVM: VMX: optimize #PF injection when MAXPHYADDR does not match Mohammed Gamal
2020-07-10 15:48 ` [PATCH v3 9/9] KVM: x86: SVM: VMX: Make GUEST_MAXPHYADDR < HOST_MAXPHYADDR support configurable Mohammed Gamal
2020-07-10 17:40   ` Paolo Bonzini
2020-07-10 16:30 ` [PATCH v3 0/9] KVM: Support guest MAXPHYADDR < host MAXPHYADDR Jim Mattson
2020-07-10 17:06   ` Paolo Bonzini
2020-07-10 17:13     ` Jim Mattson
2020-07-10 17:16       ` Paolo Bonzini
2020-07-10 17:26         ` Sean Christopherson
2020-07-10 17:26         ` Jim Mattson
2020-07-10 17:40           ` Paolo Bonzini
2020-07-10 17:49 ` 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=20200710154811.418214-7-mgamal@redhat.com \
    --to=mgamal@redhat.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=sean.j.christopherson@intel.com \
    --cc=vkuznets@redhat.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.