diff options
author | Adrian Hunter <adrian.hunter@intel.com> | 2015-04-30 10:37:31 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-05-05 17:13:00 -0400 |
commit | d20031bb63dd6dde35feb7845eaf17c620eef120 (patch) | |
tree | b36fd419c0ef1459ef4cfe1b000e1b4a3c65e6f2 /tools/perf/util/auxtrace.h | |
parent | 0ad21f6869222fd7fd7c63f02febea082e801fc2 (diff) |
perf tools: Add AUX area tracing Snapshot Mode
Add support for making snapshots of AUX area tracing data.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1430404667-10593-9-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/auxtrace.h')
-rw-r--r-- | tools/perf/util/auxtrace.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h index 8c6cbb123fe5..c2c677e62733 100644 --- a/tools/perf/util/auxtrace.h +++ b/tools/perf/util/auxtrace.h | |||
@@ -276,6 +276,10 @@ struct auxtrace_mmap_params { | |||
276 | * @info_priv_size: return the size of the private data in auxtrace_info_event | 276 | * @info_priv_size: return the size of the private data in auxtrace_info_event |
277 | * @info_fill: fill-in the private data in auxtrace_info_event | 277 | * @info_fill: fill-in the private data in auxtrace_info_event |
278 | * @free: free this auxtrace record structure | 278 | * @free: free this auxtrace record structure |
279 | * @snapshot_start: starting a snapshot | ||
280 | * @snapshot_finish: finishing a snapshot | ||
281 | * @find_snapshot: find data to snapshot within auxtrace mmap | ||
282 | * @parse_snapshot_options: parse snapshot options | ||
279 | * @reference: provide a 64-bit reference number for auxtrace_event | 283 | * @reference: provide a 64-bit reference number for auxtrace_event |
280 | * @read_finish: called after reading from an auxtrace mmap | 284 | * @read_finish: called after reading from an auxtrace mmap |
281 | */ | 285 | */ |
@@ -289,12 +293,36 @@ struct auxtrace_record { | |||
289 | struct auxtrace_info_event *auxtrace_info, | 293 | struct auxtrace_info_event *auxtrace_info, |
290 | size_t priv_size); | 294 | size_t priv_size); |
291 | void (*free)(struct auxtrace_record *itr); | 295 | void (*free)(struct auxtrace_record *itr); |
296 | int (*snapshot_start)(struct auxtrace_record *itr); | ||
297 | int (*snapshot_finish)(struct auxtrace_record *itr); | ||
298 | int (*find_snapshot)(struct auxtrace_record *itr, int idx, | ||
299 | struct auxtrace_mmap *mm, unsigned char *data, | ||
300 | u64 *head, u64 *old); | ||
301 | int (*parse_snapshot_options)(struct auxtrace_record *itr, | ||
302 | struct record_opts *opts, | ||
303 | const char *str); | ||
292 | u64 (*reference)(struct auxtrace_record *itr); | 304 | u64 (*reference)(struct auxtrace_record *itr); |
293 | int (*read_finish)(struct auxtrace_record *itr, int idx); | 305 | int (*read_finish)(struct auxtrace_record *itr, int idx); |
294 | }; | 306 | }; |
295 | 307 | ||
296 | #ifdef HAVE_AUXTRACE_SUPPORT | 308 | #ifdef HAVE_AUXTRACE_SUPPORT |
297 | 309 | ||
310 | /* | ||
311 | * In snapshot mode the mmapped page is read-only which makes using | ||
312 | * __sync_val_compare_and_swap() problematic. However, snapshot mode expects | ||
313 | * the buffer is not updated while the snapshot is made (e.g. Intel PT disables | ||
314 | * the event) so there is not a race anyway. | ||
315 | */ | ||
316 | static inline u64 auxtrace_mmap__read_snapshot_head(struct auxtrace_mmap *mm) | ||
317 | { | ||
318 | struct perf_event_mmap_page *pc = mm->userpg; | ||
319 | u64 head = ACCESS_ONCE(pc->aux_head); | ||
320 | |||
321 | /* Ensure all reads are done after we read the head */ | ||
322 | rmb(); | ||
323 | return head; | ||
324 | } | ||
325 | |||
298 | static inline u64 auxtrace_mmap__read_head(struct auxtrace_mmap *mm) | 326 | static inline u64 auxtrace_mmap__read_head(struct auxtrace_mmap *mm) |
299 | { | 327 | { |
300 | struct perf_event_mmap_page *pc = mm->userpg; | 328 | struct perf_event_mmap_page *pc = mm->userpg; |
@@ -346,6 +374,11 @@ typedef int (*process_auxtrace_t)(struct perf_tool *tool, | |||
346 | int auxtrace_mmap__read(struct auxtrace_mmap *mm, struct auxtrace_record *itr, | 374 | int auxtrace_mmap__read(struct auxtrace_mmap *mm, struct auxtrace_record *itr, |
347 | struct perf_tool *tool, process_auxtrace_t fn); | 375 | struct perf_tool *tool, process_auxtrace_t fn); |
348 | 376 | ||
377 | int auxtrace_mmap__read_snapshot(struct auxtrace_mmap *mm, | ||
378 | struct auxtrace_record *itr, | ||
379 | struct perf_tool *tool, process_auxtrace_t fn, | ||
380 | size_t snapshot_size); | ||
381 | |||
349 | int auxtrace_queues__init(struct auxtrace_queues *queues); | 382 | int auxtrace_queues__init(struct auxtrace_queues *queues); |
350 | int auxtrace_queues__add_event(struct auxtrace_queues *queues, | 383 | int auxtrace_queues__add_event(struct auxtrace_queues *queues, |
351 | struct perf_session *session, | 384 | struct perf_session *session, |
@@ -383,6 +416,9 @@ void *auxtrace_cache__lookup(struct auxtrace_cache *c, u32 key); | |||
383 | struct auxtrace_record *auxtrace_record__init(struct perf_evlist *evlist, | 416 | struct auxtrace_record *auxtrace_record__init(struct perf_evlist *evlist, |
384 | int *err); | 417 | int *err); |
385 | 418 | ||
419 | int auxtrace_parse_snapshot_options(struct auxtrace_record *itr, | ||
420 | struct record_opts *opts, | ||
421 | const char *str); | ||
386 | int auxtrace_record__options(struct auxtrace_record *itr, | 422 | int auxtrace_record__options(struct auxtrace_record *itr, |
387 | struct perf_evlist *evlist, | 423 | struct perf_evlist *evlist, |
388 | struct record_opts *opts); | 424 | struct record_opts *opts); |
@@ -392,6 +428,11 @@ int auxtrace_record__info_fill(struct auxtrace_record *itr, | |||
392 | struct auxtrace_info_event *auxtrace_info, | 428 | struct auxtrace_info_event *auxtrace_info, |
393 | size_t priv_size); | 429 | size_t priv_size); |
394 | void auxtrace_record__free(struct auxtrace_record *itr); | 430 | void auxtrace_record__free(struct auxtrace_record *itr); |
431 | int auxtrace_record__snapshot_start(struct auxtrace_record *itr); | ||
432 | int auxtrace_record__snapshot_finish(struct auxtrace_record *itr); | ||
433 | int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx, | ||
434 | struct auxtrace_mmap *mm, | ||
435 | unsigned char *data, u64 *head, u64 *old); | ||
395 | u64 auxtrace_record__reference(struct auxtrace_record *itr); | 436 | u64 auxtrace_record__reference(struct auxtrace_record *itr); |
396 | 437 | ||
397 | int auxtrace_index__auxtrace_event(struct list_head *head, union perf_event *event, | 438 | int auxtrace_index__auxtrace_event(struct list_head *head, union perf_event *event, |