Commit 2aef6f30 authored by Sean Christopherson's avatar Sean Christopherson Committed by Peter Zijlstra

perf: Force architectures to opt-in to guest callbacks

Introduce GUEST_PERF_EVENTS and require architectures to select it to
allow registering and using guest callbacks in perf.  This will hopefully
make it more difficult for new architectures to add useless "support" for
guest callbacks, e.g. via copy+paste.

Stubbing out the helpers has the happy bonus of avoiding a load of
perf_guest_cbs when GUEST_PERF_EVENTS=n on arm64/x86.
Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Link: https://lore.kernel.org/r/20211111020738.2512932-9-seanjc@google.com
parent 1c343051
...@@ -39,6 +39,7 @@ menuconfig KVM ...@@ -39,6 +39,7 @@ menuconfig KVM
select HAVE_KVM_IRQ_BYPASS select HAVE_KVM_IRQ_BYPASS
select HAVE_KVM_VCPU_RUN_PID_CHANGE select HAVE_KVM_VCPU_RUN_PID_CHANGE
select SCHED_INFO select SCHED_INFO
select GUEST_PERF_EVENTS if PERF_EVENTS
help help
Support hosting virtualized guest machines. Support hosting virtualized guest machines.
......
...@@ -36,6 +36,7 @@ config KVM ...@@ -36,6 +36,7 @@ config KVM
select KVM_MMIO select KVM_MMIO
select SCHED_INFO select SCHED_INFO
select PERF_EVENTS select PERF_EVENTS
select GUEST_PERF_EVENTS
select HAVE_KVM_MSI select HAVE_KVM_MSI
select HAVE_KVM_CPU_RELAX_INTERCEPT select HAVE_KVM_CPU_RELAX_INTERCEPT
select HAVE_KVM_NO_POLL select HAVE_KVM_NO_POLL
......
...@@ -23,6 +23,7 @@ config XEN_PV ...@@ -23,6 +23,7 @@ config XEN_PV
select PARAVIRT_XXL select PARAVIRT_XXL
select XEN_HAVE_PVMMU select XEN_HAVE_PVMMU
select XEN_HAVE_VPMU select XEN_HAVE_VPMU
select GUEST_PERF_EVENTS
help help
Support running as a Xen PV guest. Support running as a Xen PV guest.
......
...@@ -1242,6 +1242,7 @@ extern void perf_event_bpf_event(struct bpf_prog *prog, ...@@ -1242,6 +1242,7 @@ extern void perf_event_bpf_event(struct bpf_prog *prog,
enum perf_bpf_event_type type, enum perf_bpf_event_type type,
u16 flags); u16 flags);
#ifdef CONFIG_GUEST_PERF_EVENTS
extern struct perf_guest_info_callbacks __rcu *perf_guest_cbs; extern struct perf_guest_info_callbacks __rcu *perf_guest_cbs;
static inline struct perf_guest_info_callbacks *perf_get_guest_cbs(void) static inline struct perf_guest_info_callbacks *perf_get_guest_cbs(void)
{ {
...@@ -1280,6 +1281,11 @@ static inline unsigned int perf_guest_handle_intel_pt_intr(void) ...@@ -1280,6 +1281,11 @@ static inline unsigned int perf_guest_handle_intel_pt_intr(void)
} }
extern void perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *cbs); extern void perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *cbs);
extern void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs); extern void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs);
#else
static inline unsigned int perf_guest_state(void) { return 0; }
static inline unsigned long perf_guest_get_ip(void) { return 0; }
static inline unsigned int perf_guest_handle_intel_pt_intr(void) { return 0; }
#endif /* CONFIG_GUEST_PERF_EVENTS */
extern void perf_event_exec(void); extern void perf_event_exec(void);
extern void perf_event_comm(struct task_struct *tsk, bool exec); extern void perf_event_comm(struct task_struct *tsk, bool exec);
......
...@@ -1804,6 +1804,10 @@ config HAVE_PERF_EVENTS ...@@ -1804,6 +1804,10 @@ config HAVE_PERF_EVENTS
help help
See tools/perf/design.txt for details. See tools/perf/design.txt for details.
config GUEST_PERF_EVENTS
bool
depends on HAVE_PERF_EVENTS
config PERF_USE_VMALLOC config PERF_USE_VMALLOC
bool bool
help help
......
...@@ -6521,6 +6521,7 @@ static void perf_pending_event(struct irq_work *entry) ...@@ -6521,6 +6521,7 @@ static void perf_pending_event(struct irq_work *entry)
perf_swevent_put_recursion_context(rctx); perf_swevent_put_recursion_context(rctx);
} }
#ifdef CONFIG_GUEST_PERF_EVENTS
struct perf_guest_info_callbacks __rcu *perf_guest_cbs; struct perf_guest_info_callbacks __rcu *perf_guest_cbs;
void perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *cbs) void perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *cbs)
...@@ -6541,6 +6542,7 @@ void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs) ...@@ -6541,6 +6542,7 @@ void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs)
synchronize_rcu(); synchronize_rcu();
} }
EXPORT_SYMBOL_GPL(perf_unregister_guest_info_callbacks); EXPORT_SYMBOL_GPL(perf_unregister_guest_info_callbacks);
#endif
static void static void
perf_output_sample_regs(struct perf_output_handle *handle, perf_output_sample_regs(struct perf_output_handle *handle,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment