perf: Force architectures to opt-in to guest callbacks
authorSean Christopherson <seanjc@google.com>
Thu, 11 Nov 2021 02:07:29 +0000 (02:07 +0000)
committerPeter Zijlstra <peterz@infradead.org>
Wed, 17 Nov 2021 13:49:08 +0000 (14:49 +0100)
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: Sean Christopherson <seanjc@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Link: https://lore.kernel.org/r/20211111020738.2512932-9-seanjc@google.com
arch/arm64/kvm/Kconfig
arch/x86/kvm/Kconfig
arch/x86/xen/Kconfig
include/linux/perf_event.h
init/Kconfig
kernel/events/core.c

index 8ffcbe29395e0c4fff5293ac2ec28f71a57d98b3..e9761d84f982e8afb80380ffc53a1a84d8e661ce 100644 (file)
@@ -39,6 +39,7 @@ menuconfig KVM
        select HAVE_KVM_IRQ_BYPASS
        select HAVE_KVM_VCPU_RUN_PID_CHANGE
        select SCHED_INFO
+       select GUEST_PERF_EVENTS if PERF_EVENTS
        help
          Support hosting virtualized guest machines.
 
index 6191861381768c60e5aa409e05934fba3a21d4a6..47bdbe705a76be37f9fc9f74751f928cb95aa9ee 100644 (file)
@@ -36,6 +36,7 @@ config KVM
        select KVM_MMIO
        select SCHED_INFO
        select PERF_EVENTS
+       select GUEST_PERF_EVENTS
        select HAVE_KVM_MSI
        select HAVE_KVM_CPU_RELAX_INTERCEPT
        select HAVE_KVM_NO_POLL
index 6bcd3d8ca6ac5fa46290b369e0119d9ea652c7d8..85246dd9faa14cf55c947eacc227d6ad76e8a916 100644 (file)
@@ -23,6 +23,7 @@ config XEN_PV
        select PARAVIRT_XXL
        select XEN_HAVE_PVMMU
        select XEN_HAVE_VPMU
+       select GUEST_PERF_EVENTS
        help
          Support running as a Xen PV guest.
 
index 346d5aff580482975f6613a815ffd5b571cc2add..ea47ef616ee04203a9dd3d5d401340522fb1f586 100644 (file)
@@ -1242,6 +1242,7 @@ extern void perf_event_bpf_event(struct bpf_prog *prog,
                                 enum perf_bpf_event_type type,
                                 u16 flags);
 
+#ifdef CONFIG_GUEST_PERF_EVENTS
 extern struct perf_guest_info_callbacks __rcu *perf_guest_cbs;
 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)
 }
 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);
+#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_comm(struct task_struct *tsk, bool exec);
index 036b750e8d8a8b74007da9f9568b775bb349a857..72d40b3b5805d2fff49b0cef509179376fb3af36 100644 (file)
@@ -1804,6 +1804,10 @@ config HAVE_PERF_EVENTS
        help
          See tools/perf/design.txt for details.
 
+config GUEST_PERF_EVENTS
+       bool
+       depends on HAVE_PERF_EVENTS
+
 config PERF_USE_VMALLOC
        bool
        help
index 17e5b20762c50df8965a83da0599efa7d2da5b37..5a3502cd5362c5c9ce421a197e51ff20283a64f9 100644 (file)
@@ -6521,6 +6521,7 @@ static void perf_pending_event(struct irq_work *entry)
                perf_swevent_put_recursion_context(rctx);
 }
 
+#ifdef CONFIG_GUEST_PERF_EVENTS
 struct perf_guest_info_callbacks __rcu *perf_guest_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)
        synchronize_rcu();
 }
 EXPORT_SYMBOL_GPL(perf_unregister_guest_info_callbacks);
+#endif
 
 static void
 perf_output_sample_regs(struct perf_output_handle *handle,