diff options
author | Kan Liang <kan.liang@linux.intel.com> | 2020-07-23 10:11:14 -0700 |
---|---|---|
committer | Peter Zijlstra <peterz@infradead.org> | 2020-08-18 16:34:37 +0200 |
commit | 2cb5383b30d47c446ec7d884cd80f93ffcc31817 (patch) | |
tree | d8b2963bff1b5a75b9d65b2e6680b841b1d91b03 /include/linux/perf_event.h | |
parent | 59a854e2f3b90ad2cc7368ae392de40b981ad51d (diff) | |
download | lwn-2cb5383b30d47c446ec7d884cd80f93ffcc31817.tar.gz lwn-2cb5383b30d47c446ec7d884cd80f93ffcc31817.zip |
perf/x86/intel: Support per-thread RDPMC TopDown metrics
Starts from Ice Lake, the TopDown metrics are directly available as
fixed counters and do not require generic counters. Also, the TopDown
metrics can be collected per thread. Extend the RDPMC usage to support
per-thread TopDown metrics.
The RDPMC index of the PERF_METRICS will be output if RDPMC users ask
for the RDPMC index of the metrics events.
To support per thread RDPMC TopDown, the metrics and slots counters have
to be saved/restored during the context switching.
The last_period and period_left are not used in the counting mode. Use
the fields for saved_metric and saved_slots.
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200723171117.9918-12-kan.liang@linux.intel.com
Diffstat (limited to 'include/linux/perf_event.h')
-rw-r--r-- | include/linux/perf_event.h | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 6048650f8c1d..46a3974eb4fe 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -212,17 +212,26 @@ struct hw_perf_event { */ u64 sample_period; - /* - * The period we started this sample with. - */ - u64 last_period; + union { + struct { /* Sampling */ + /* + * The period we started this sample with. + */ + u64 last_period; - /* - * However much is left of the current period; note that this is - * a full 64bit value and allows for generation of periods longer - * than hardware might allow. - */ - local64_t period_left; + /* + * However much is left of the current period; + * note that this is a full 64bit value and + * allows for generation of periods longer + * than hardware might allow. + */ + local64_t period_left; + }; + struct { /* Topdown events counting for context switch */ + u64 saved_metric; + u64 saved_slots; + }; + }; /* * State for throttling the event, see __perf_event_overflow() and |