public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86/perf: Fix guest_get_msrs static call if there is no PMU
@ 2021-03-05 22:33 Sean Christopherson
  2021-03-08  2:25 ` Xu, Like
  0 siblings, 1 reply; 12+ messages in thread
From: Sean Christopherson @ 2021-03-05 22:33 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Thomas Gleixner, Borislav Petkov, x86
  Cc: Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	H. Peter Anvin, linux-kernel, Like Xu, Paolo Bonzini, Jim Mattson,
	kvm, Dmitry Vyukov, Sean Christopherson

Handle a NULL x86_pmu.guest_get_msrs at invocation instead of patching
in perf_guest_get_msrs_nop() during setup.  If there is no PMU, setup
bails before updating the static calls, leaving x86_pmu.guest_get_msrs
NULL and thus a complete nop.  Ultimately, this causes VMX abort on
VM-Exit due to KVM putting random garbage from the stack into the MSR
load list.

Fixes: abd562df94d1 ("x86/perf: Use static_call for x86_pmu.guest_get_msrs")
Cc: Like Xu <like.xu@linux.intel.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Jim Mattson <jmattson@google.com>
Cc: kvm@vger.kernel.org
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
 arch/x86/events/core.c | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
index 6ddeed3cd2ac..ff874461f14c 100644
--- a/arch/x86/events/core.c
+++ b/arch/x86/events/core.c
@@ -671,7 +671,11 @@ void x86_pmu_disable_all(void)
 
 struct perf_guest_switch_msr *perf_guest_get_msrs(int *nr)
 {
-	return static_call(x86_pmu_guest_get_msrs)(nr);
+	if (x86_pmu.guest_get_msrs)
+		return static_call(x86_pmu_guest_get_msrs)(nr);
+
+	*nr = 0;
+	return NULL;
 }
 EXPORT_SYMBOL_GPL(perf_guest_get_msrs);
 
@@ -1944,13 +1948,6 @@ static void _x86_pmu_read(struct perf_event *event)
 	x86_perf_event_update(event);
 }
 
-static inline struct perf_guest_switch_msr *
-perf_guest_get_msrs_nop(int *nr)
-{
-	*nr = 0;
-	return NULL;
-}
-
 static int __init init_hw_perf_events(void)
 {
 	struct x86_pmu_quirk *quirk;
@@ -2024,9 +2021,6 @@ static int __init init_hw_perf_events(void)
 	if (!x86_pmu.read)
 		x86_pmu.read = _x86_pmu_read;
 
-	if (!x86_pmu.guest_get_msrs)
-		x86_pmu.guest_get_msrs = perf_guest_get_msrs_nop;
-
 	x86_pmu_static_call_update();
 
 	/*
-- 
2.30.1.766.gb4fecdf3b7-goog


^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2021-03-09 17:08 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-03-05 22:33 [PATCH] x86/perf: Fix guest_get_msrs static call if there is no PMU Sean Christopherson
2021-03-08  2:25 ` Xu, Like
2021-03-08  7:12   ` Dmitry Vyukov
2021-03-08  8:35     ` Like Xu
2021-03-08  8:51       ` Dmitry Vyukov
2021-03-08  8:53   ` Peter Zijlstra
2021-03-08 12:01     ` Xu, Like
2021-03-08 20:40     ` Sean Christopherson
2021-03-09  7:46       ` Peter Zijlstra
2021-03-09  8:45         ` Peter Zijlstra
2021-03-09 17:05           ` Sean Christopherson
2021-03-09 17:07             ` Dmitry Vyukov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox