perf: Allow normal events to output AUX data
In some cases, ordinary (non-AUX) events can generate data for AUX events. For example, PEBS events can come out as records in the Intel PT stream instead of their usual DS records, if configured to do so. One requirement for such events is to consistently schedule together, to ensure that the data from the "AUX output" events isn't lost while their corresponding AUX event is not scheduled. We use grouping to provide this guarantee: an "AUX output" event can be added to a group where an AUX event is a group leader, and provided that the former supports writing to the latter. Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: kan.liang@linux.intel.com Link: https://lkml.kernel.org/r/20190806084606.4021-2-alexander.shishkin@linux.intel.com
This commit is contained in:

committed by
Peter Zijlstra

parent
794b8bedca
commit
ab43762ef0
@@ -246,6 +246,7 @@ struct perf_event;
|
||||
#define PERF_PMU_CAP_ITRACE 0x20
|
||||
#define PERF_PMU_CAP_HETEROGENEOUS_CPUS 0x40
|
||||
#define PERF_PMU_CAP_NO_EXCLUDE 0x80
|
||||
#define PERF_PMU_CAP_AUX_OUTPUT 0x100
|
||||
|
||||
/**
|
||||
* struct pmu - generic performance monitoring unit
|
||||
@@ -446,6 +447,16 @@ struct pmu {
|
||||
void (*addr_filters_sync) (struct perf_event *event);
|
||||
/* optional */
|
||||
|
||||
/*
|
||||
* Check if event can be used for aux_output purposes for
|
||||
* events of this PMU.
|
||||
*
|
||||
* Runs from perf_event_open(). Should return 0 for "no match"
|
||||
* or non-zero for "match".
|
||||
*/
|
||||
int (*aux_output_match) (struct perf_event *event);
|
||||
/* optional */
|
||||
|
||||
/*
|
||||
* Filter events for PMU-specific reasons.
|
||||
*/
|
||||
@@ -681,6 +692,9 @@ struct perf_event {
|
||||
struct perf_addr_filter_range *addr_filter_ranges;
|
||||
unsigned long addr_filters_gen;
|
||||
|
||||
/* for aux_output events */
|
||||
struct perf_event *aux_event;
|
||||
|
||||
void (*destroy)(struct perf_event *);
|
||||
struct rcu_head rcu_head;
|
||||
|
||||
|
Reference in New Issue
Block a user