diff options
| author | Stephane Eranian <eranian@google.com> | 2014-09-24 07:48:37 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2014-11-16 05:41:57 -0500 |
| commit | 60e2364e60e86e81bc6377f49779779e6120977f (patch) | |
| tree | 669f675c67744cbdd61291f2ec3d03cbb51288d3 /include/uapi/linux | |
| parent | af4bdcf675cf768dc3558682fc178e0e3e70bb52 (diff) | |
perf: Add ability to sample machine state on interrupt
Enable capture of interrupted machine state for each sample.
Registers to sample are passed per event in the sample_regs_intr bitmask.
To sample interrupt machine state, the PERF_SAMPLE_INTR_REGS must be passed in
sample_type.
The list of available registers is arch dependent and provided by asm/perf_regs.h
Registers are laid out as u64 in the order of the bit order of sample_intr_regs.
This patch also adds a new ABI version PERF_ATTR_SIZE_VER4 because we extend
the perf_event_attr struct with a new u64 field.
Reviewed-by: Jiri Olsa <jolsa@redhat.com>
Signed-off-by: Stephane Eranian <eranian@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: cebbert.lkml@gmail.com
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: linux-api@vger.kernel.org
Link: http://lkml.kernel.org/r/1411559322-16548-2-git-send-email-eranian@google.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'include/uapi/linux')
| -rw-r--r-- | include/uapi/linux/perf_event.h | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h index 9d845404d875..9b79abbd1ab8 100644 --- a/include/uapi/linux/perf_event.h +++ b/include/uapi/linux/perf_event.h | |||
| @@ -137,8 +137,9 @@ enum perf_event_sample_format { | |||
| 137 | PERF_SAMPLE_DATA_SRC = 1U << 15, | 137 | PERF_SAMPLE_DATA_SRC = 1U << 15, |
| 138 | PERF_SAMPLE_IDENTIFIER = 1U << 16, | 138 | PERF_SAMPLE_IDENTIFIER = 1U << 16, |
| 139 | PERF_SAMPLE_TRANSACTION = 1U << 17, | 139 | PERF_SAMPLE_TRANSACTION = 1U << 17, |
| 140 | PERF_SAMPLE_REGS_INTR = 1U << 18, | ||
| 140 | 141 | ||
| 141 | PERF_SAMPLE_MAX = 1U << 18, /* non-ABI */ | 142 | PERF_SAMPLE_MAX = 1U << 19, /* non-ABI */ |
| 142 | }; | 143 | }; |
| 143 | 144 | ||
| 144 | /* | 145 | /* |
| @@ -238,6 +239,7 @@ enum perf_event_read_format { | |||
| 238 | #define PERF_ATTR_SIZE_VER2 80 /* add: branch_sample_type */ | 239 | #define PERF_ATTR_SIZE_VER2 80 /* add: branch_sample_type */ |
| 239 | #define PERF_ATTR_SIZE_VER3 96 /* add: sample_regs_user */ | 240 | #define PERF_ATTR_SIZE_VER3 96 /* add: sample_regs_user */ |
| 240 | /* add: sample_stack_user */ | 241 | /* add: sample_stack_user */ |
| 242 | #define PERF_ATTR_SIZE_VER4 104 /* add: sample_regs_intr */ | ||
| 241 | 243 | ||
| 242 | /* | 244 | /* |
| 243 | * Hardware event_id to monitor via a performance monitoring event: | 245 | * Hardware event_id to monitor via a performance monitoring event: |
| @@ -334,6 +336,15 @@ struct perf_event_attr { | |||
| 334 | 336 | ||
| 335 | /* Align to u64. */ | 337 | /* Align to u64. */ |
| 336 | __u32 __reserved_2; | 338 | __u32 __reserved_2; |
| 339 | /* | ||
| 340 | * Defines set of regs to dump for each sample | ||
| 341 | * state captured on: | ||
| 342 | * - precise = 0: PMU interrupt | ||
| 343 | * - precise > 0: sampled instruction | ||
| 344 | * | ||
| 345 | * See asm/perf_regs.h for details. | ||
| 346 | */ | ||
| 347 | __u64 sample_regs_intr; | ||
| 337 | }; | 348 | }; |
| 338 | 349 | ||
| 339 | #define perf_flags(attr) (*(&(attr)->read_format + 1)) | 350 | #define perf_flags(attr) (*(&(attr)->read_format + 1)) |
| @@ -686,6 +697,8 @@ enum perf_event_type { | |||
| 686 | * { u64 weight; } && PERF_SAMPLE_WEIGHT | 697 | * { u64 weight; } && PERF_SAMPLE_WEIGHT |
| 687 | * { u64 data_src; } && PERF_SAMPLE_DATA_SRC | 698 | * { u64 data_src; } && PERF_SAMPLE_DATA_SRC |
| 688 | * { u64 transaction; } && PERF_SAMPLE_TRANSACTION | 699 | * { u64 transaction; } && PERF_SAMPLE_TRANSACTION |
| 700 | * { u64 abi; # enum perf_sample_regs_abi | ||
| 701 | * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR | ||
| 689 | * }; | 702 | * }; |
| 690 | */ | 703 | */ |
| 691 | PERF_RECORD_SAMPLE = 9, | 704 | PERF_RECORD_SAMPLE = 9, |
