kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sean Christopherson <seanjc@google.com>
To: Sean Christopherson <seanjc@google.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>,
	Maxim Levitsky <mlevitsk@redhat.com>,
	Li RongQing <lirongqing@baidu.com>
Subject: [PATCH 02/19] KVM: SVM: Don't put/load AVIC when setting virtual APIC mode
Date: Wed, 31 Aug 2022 00:34:49 +0000	[thread overview]
Message-ID: <20220831003506.4117148-3-seanjc@google.com> (raw)
In-Reply-To: <20220831003506.4117148-1-seanjc@google.com>

Move the VMCB updates from avic_refresh_apicv_exec_ctrl() into
avic_set_virtual_apic_mode() and invert the dependency being said
functions to avoid calling avic_vcpu_{load,put}() and
avic_set_pi_irte_mode() when "only" setting the virtual APIC mode.

avic_set_virtual_apic_mode() is invoked from common x86 with preemption
enabled, which makes avic_vcpu_{load,put}() unhappy.  Luckily, calling
those and updating IRTE stuff is unnecessary as the only reason
avic_set_virtual_apic_mode() is called is to handle transitions between
xAPIC and x2APIC that don't also toggle APICv activation.  And if
activation doesn't change, there's no need to fiddle with the physical
APIC ID table or update IRTE.

The "full" refresh is guaranteed to be called if activation changes in
this case as the only call to the "set" path is:

	kvm_vcpu_update_apicv(vcpu);
	static_call_cond(kvm_x86_set_virtual_apic_mode)(vcpu);

and kvm_vcpu_update_apicv() invokes the refresh if activation changes:

	if (apic->apicv_active == activate)
		goto out;

	apic->apicv_active = activate;
	kvm_apic_update_apicv(vcpu);
	static_call(kvm_x86_refresh_apicv_exec_ctrl)(vcpu);

  WARNING: CPU: 183 PID: 49186 at arch/x86/kvm/svm/avic.c:1081 avic_vcpu_put+0xde/0xf0 [kvm_amd]
  CPU: 183 PID: 49186 Comm: stable Tainted: G           O       6.0.0-smp--fcddbca45f0a-sink #34
  Hardware name: Google, Inc. Arcadia_IT_80/Arcadia_IT_80, BIOS 10.48.0 01/27/2022
  RIP: 0010:avic_vcpu_put+0xde/0xf0 [kvm_amd]
   avic_refresh_apicv_exec_ctrl+0x142/0x1c0 [kvm_amd]
   avic_set_virtual_apic_mode+0x5a/0x70 [kvm_amd]
   kvm_lapic_set_base+0x149/0x1a0 [kvm]
   kvm_set_apic_base+0x8f/0xd0 [kvm]
   kvm_set_msr_common+0xa3a/0xdc0 [kvm]
   svm_set_msr+0x364/0x6b0 [kvm_amd]
   __kvm_set_msr+0xb8/0x1c0 [kvm]
   kvm_emulate_wrmsr+0x58/0x1d0 [kvm]
   msr_interception+0x1c/0x30 [kvm_amd]
   svm_invoke_exit_handler+0x31/0x100 [kvm_amd]
   svm_handle_exit+0xfc/0x160 [kvm_amd]
   vcpu_enter_guest+0x21bb/0x23e0 [kvm]
   vcpu_run+0x92/0x450 [kvm]
   kvm_arch_vcpu_ioctl_run+0x43e/0x6e0 [kvm]
   kvm_vcpu_ioctl+0x559/0x620 [kvm]

Fixes: 05c4fe8c1bd9 ("KVM: SVM: Refresh AVIC configuration when changing APIC mode")
Cc: stable@vger.kernel.org
Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Cc: Maxim Levitsky <mlevitsk@redhat.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
 arch/x86/kvm/svm/avic.c | 31 +++++++++++++++----------------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c
index b1ade555e8d0..f3a74c8284cb 100644
--- a/arch/x86/kvm/svm/avic.c
+++ b/arch/x86/kvm/svm/avic.c
@@ -741,18 +741,6 @@ void avic_apicv_post_state_restore(struct kvm_vcpu *vcpu)
 	avic_handle_ldr_update(vcpu);
 }
 
-void avic_set_virtual_apic_mode(struct kvm_vcpu *vcpu)
-{
-	if (!lapic_in_kernel(vcpu) || avic_mode == AVIC_MODE_NONE)
-		return;
-
-	if (kvm_get_apic_mode(vcpu) == LAPIC_MODE_INVALID) {
-		WARN_ONCE(true, "Invalid local APIC state (vcpu_id=%d)", vcpu->vcpu_id);
-		return;
-	}
-	avic_refresh_apicv_exec_ctrl(vcpu);
-}
-
 static int avic_set_pi_irte_mode(struct kvm_vcpu *vcpu, bool activate)
 {
 	int ret = 0;
@@ -1094,17 +1082,18 @@ void avic_vcpu_put(struct kvm_vcpu *vcpu)
 	WRITE_ONCE(*(svm->avic_physical_id_cache), entry);
 }
 
-
-void avic_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
+void avic_set_virtual_apic_mode(struct kvm_vcpu *vcpu)
 {
 	struct vcpu_svm *svm = to_svm(vcpu);
 	struct vmcb *vmcb = svm->vmcb01.ptr;
-	bool activated = kvm_vcpu_apicv_active(vcpu);
+
+	if (!lapic_in_kernel(vcpu) || avic_mode == AVIC_MODE_NONE)
+		return;
 
 	if (!enable_apicv)
 		return;
 
-	if (activated) {
+	if (kvm_vcpu_apicv_active(vcpu)) {
 		/**
 		 * During AVIC temporary deactivation, guest could update
 		 * APIC ID, DFR and LDR registers, which would not be trapped
@@ -1118,6 +1107,16 @@ void avic_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
 		avic_deactivate_vmcb(svm);
 	}
 	vmcb_mark_dirty(vmcb, VMCB_AVIC);
+}
+
+void avic_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
+{
+	bool activated = kvm_vcpu_apicv_active(vcpu);
+
+	if (!enable_apicv)
+		return;
+
+	avic_set_virtual_apic_mode(vcpu);
 
 	if (activated)
 		avic_vcpu_load(vcpu, vcpu->cpu);
-- 
2.37.2.672.g94769d06f0-goog


  parent reply	other threads:[~2022-08-31  0:37 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-31  0:34 [PATCH 00/19] KVM: x86: AVIC and local APIC fixes+cleanups Sean Christopherson
2022-08-31  0:34 ` [PATCH 01/19] KVM: SVM: Process ICR on AVIC IPI delivery failure due to invalid target Sean Christopherson
2022-08-31  9:18   ` Maxim Levitsky
2022-08-31  0:34 ` Sean Christopherson [this message]
2022-08-31  9:24   ` [PATCH 02/19] KVM: SVM: Don't put/load AVIC when setting virtual APIC mode Maxim Levitsky
2022-08-31 16:33     ` Sean Christopherson
2022-08-31  0:34 ` [PATCH 03/19] Revert "KVM: SVM: Introduce hybrid-AVIC mode" Sean Christopherson
2022-08-31  5:59   ` Maxim Levitsky
2022-08-31  6:45     ` Maxim Levitsky
2022-08-31 16:29       ` Sean Christopherson
2022-08-31 17:46         ` Maxim Levitsky
2022-08-31 17:58           ` Jim Mattson
2022-08-31 18:01             ` Maxim Levitsky
2022-08-31 19:12           ` Sean Christopherson
2022-09-01 10:25             ` Maxim Levitsky
2022-09-01 11:47               ` Jim Mattson
2022-09-01 13:29               ` Sean Christopherson
2022-09-01 13:53               ` Sean Christopherson
2022-09-01 15:08               ` Sean Christopherson
2022-08-31 16:19     ` Sean Christopherson
2022-08-31 17:47       ` Maxim Levitsky
2022-08-31  0:34 ` [PATCH 04/19] KVM: SVM: Replace "avic_mode" enum with "x2avic_enabled" boolean Sean Christopherson
2022-08-31  9:36   ` Maxim Levitsky
2022-08-31  0:34 ` [PATCH 05/19] KVM: SVM: Compute dest based on sender's x2APIC status for AVIC kick Sean Christopherson
2022-08-31  9:38   ` Maxim Levitsky
2022-09-01  2:56   ` Li,Rongqing
2022-08-31  0:34 ` [PATCH 06/19] KVM: SVM: Get x2APIC logical dest bitmap from ICRH[15:0], not ICHR[31:16] Sean Christopherson
2022-08-31  6:09   ` Maxim Levitsky
2022-08-31  9:43     ` Maxim Levitsky
2022-08-31 16:35       ` Sean Christopherson
2022-08-31 18:18         ` Maxim Levitsky
2022-08-31  0:34 ` [PATCH 07/19] KVM: SVM: Drop buggy and redundant AVIC "single logical dest" check Sean Christopherson
2022-08-31  6:19   ` Maxim Levitsky
2022-08-31 16:37     ` Sean Christopherson
2022-08-31 18:10       ` Maxim Levitsky
2022-08-31  0:34 ` [PATCH 08/19] KVM: SVM: Remove redundant cluster calculation that also creates a shadow Sean Christopherson
2022-08-31 10:19   ` Maxim Levitsky
2022-09-01 20:02     ` Sean Christopherson
2022-08-31  0:34 ` [PATCH 09/19] KVM: SVM: Drop duplicate calcuation of AVIC/x2AVIC "logical index" Sean Christopherson
2022-08-31  0:34 ` [PATCH 10/19] KVM: SVM: Document that vCPU ID == APIC ID in AVIC kick fastpatch Sean Christopherson
2022-08-31 10:22   ` Maxim Levitsky
2022-08-31 16:16     ` Sean Christopherson
2022-08-31 17:49       ` Maxim Levitsky
2022-08-31  0:34 ` [PATCH 11/19] KVM: SVM: Add helper to perform final AVIC "kick" of single vCPU Sean Christopherson
2022-08-31 10:25   ` Maxim Levitsky
2022-08-31 15:08     ` Sean Christopherson
2022-08-31 18:12       ` Maxim Levitsky
2022-08-31  0:34 ` [PATCH 12/19] KVM: x86: Disable APIC logical map if logical ID covers multiple MDAs Sean Christopherson
2022-08-31 13:23   ` Maxim Levitsky
2022-08-31  0:35 ` [PATCH 13/19] KVM: x86: Disable APIC logical map if vCPUs are aliased in logical mode Sean Christopherson
2022-08-31 13:24   ` Maxim Levitsky
2022-08-31  0:35 ` [PATCH 14/19] KVM: x86: Honor architectural behavior for aliased 8-bit APIC IDs Sean Christopherson
2022-08-31 13:37   ` Maxim Levitsky
2022-08-31 16:41     ` Sean Christopherson
2022-08-31 17:51       ` Maxim Levitsky
2022-08-31  0:35 ` [PATCH 15/19] KVM: x86: Explicitly skip optimized logical map setup if vCPU's LDR==0 Sean Christopherson
2022-08-31 13:41   ` Maxim Levitsky
2022-08-31 16:47     ` Sean Christopherson
2022-08-31  0:35 ` [PATCH 16/19] KVM: x86: Explicitly track all possibilities for APIC map's logical modes Sean Christopherson
2022-08-31 13:43   ` Maxim Levitsky
2022-08-31 16:56     ` Sean Christopherson
2022-08-31 17:53       ` Maxim Levitsky
2022-09-16 18:58         ` Sean Christopherson
2022-08-31 18:42   ` Maxim Levitsky
2022-08-31 19:17     ` Sean Christopherson
2022-08-31  0:35 ` [PATCH 17/19] KVM: SVM: Handle multiple logical targets in AVIC kick fastpath Sean Christopherson
2022-08-31 13:57   ` Maxim Levitsky
2022-08-31 18:19     ` Sean Christopherson
2022-08-31 18:25       ` Maxim Levitsky
2022-08-31  0:35 ` [PATCH 18/19] KVM: SVM: Ignore writes to Remote Read Data on AVIC write traps Sean Christopherson
2022-08-31 10:40   ` Maxim Levitsky
2022-08-31  0:35 ` [PATCH 19/19] Revert "KVM: SVM: Do not throw warning when calling avic_vcpu_load on a running vcpu" Sean Christopherson
2022-08-31  6:07   ` Maxim Levitsky
2022-08-31  7:03     ` 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=20220831003506.4117148-3-seanjc@google.com \
    --to=seanjc@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lirongqing@baidu.com \
    --cc=mlevitsk@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=suravee.suthikulpanit@amd.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).