lkml.org 
[lkml]   [2021]   [Aug]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
Subject[PATCH v2 00/13] perf: KVM: Fix, optimize, and clean up callbacks
From
This is a combination of ~2 series to fix bugs in the perf+KVM callbacks,
optimize the callbacks by employing static_call, and do a variety of
cleanup in both perf and KVM.

Patch 1 fixes a mostly-theoretical bug where perf can deref a NULL
pointer if KVM unregisters its callbacks while they're being accessed.
In practice, compilers tend to avoid problematic reloads of the pointer
and the PMI handler doesn't lose the race against module unloading,
i.e doesn't hit a use-after-free.

Patches 2 and 3 fix an Intel PT handling bug where KVM incorrectly
eats PT interrupts when PT is supposed to be owned entirely by the host.

Patches 4-7 clean up perf's callback infrastructure and switch to
static_call for arm64 and x86 (the only survivors).

Patches 8-13 clean up related KVM code and unify the arm64/x86 callbacks.

Based on "git://git.kernel.org/pub/scm/virt/kvm/kvm.git queue", commit
680c7e3be6a3 ("KVM: x86: Exit to userspace ...").

v2 (relatively to static_call v10)
- Split the patch into the semantic change (multiplexed ->state) and
introduction of static_call.
- Don't use '0' for "not a guest RIP".
- Handle unregister path.
- Drop changes for architectures that can be culled entirely.

v2 (relative to v1)
- Drop per-cpu approach. [Peter]
- Fix mostly-theoretical reload and use-after-free with READ_ONCE(),
WRITE_ONCE(), and synchronize_rcu(). [Peter]
- Avoid new exports like the plague. [Peter]

v1:
- https://lkml.kernel.org/r/20210827005718.585190-1-seanjc@google.com

v10 static_call:
- https://lkml.kernel.org/r/20210806133802.3528-2-lingshan.zhu@intel.com

Like Xu (2):
perf/core: Rework guest callbacks to prepare for static_call support
perf/core: Use static_call to optimize perf_guest_info_callbacks

Sean Christopherson (11):
perf: Ensure perf_guest_cbs aren't reloaded between !NULL check and
deref
KVM: x86: Register perf callbacks after calling vendor's
hardware_setup()
KVM: x86: Register Processor Trace interrupt hook iff PT enabled in
guest
perf: Stop pretending that perf can handle multiple guest callbacks
perf: Force architectures to opt-in to guest callbacks
KVM: x86: Drop current_vcpu for kvm_running_vcpu + kvm_arch_vcpu
variable
KVM: x86: More precisely identify NMI from guest when handling PMI
KVM: Move x86's perf guest info callbacks to generic KVM
KVM: x86: Move Intel Processor Trace interrupt handler to vmx.c
KVM: arm64: Convert to the generic perf callbacks
KVM: arm64: Drop perf.c and fold its tiny bits of code into arm.c /
pmu.c

arch/arm/kernel/perf_callchain.c | 28 ++------------
arch/arm64/Kconfig | 1 +
arch/arm64/include/asm/kvm_host.h | 13 ++++++-
arch/arm64/kernel/perf_callchain.c | 28 +++++++++++---
arch/arm64/kvm/Makefile | 2 +-
arch/arm64/kvm/arm.c | 11 +++++-
arch/arm64/kvm/perf.c | 62 ------------------------------
arch/arm64/kvm/pmu.c | 8 ++++
arch/csky/kernel/perf_callchain.c | 10 -----
arch/nds32/kernel/perf_event_cpu.c | 29 ++------------
arch/riscv/kernel/perf_callchain.c | 10 -----
arch/x86/Kconfig | 1 +
arch/x86/events/core.c | 36 ++++++++++++++---
arch/x86/events/intel/core.c | 7 ++--
arch/x86/include/asm/kvm_host.h | 8 +++-
arch/x86/kvm/pmu.c | 2 +-
arch/x86/kvm/svm/svm.c | 2 +-
arch/x86/kvm/vmx/vmx.c | 25 +++++++++++-
arch/x86/kvm/x86.c | 58 +++++-----------------------
arch/x86/kvm/x86.h | 17 ++++++--
arch/x86/xen/pmu.c | 32 +++++++--------
include/kvm/arm_pmu.h | 1 +
include/linux/kvm_host.h | 10 +++++
include/linux/perf_event.h | 26 ++++++++-----
init/Kconfig | 3 ++
kernel/events/core.c | 24 ++++++------
virt/kvm/kvm_main.c | 40 +++++++++++++++++++
27 files changed, 245 insertions(+), 249 deletions(-)
delete mode 100644 arch/arm64/kvm/perf.c

--
2.33.0.259.gc128427fd7-goog

\
 
 \ /
  Last update: 2021-08-28 02:36    [W:0.182 / U:0.040 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site