aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/auxtrace.h
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2015-04-30 10:37:31 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-05-05 17:13:00 -0400
commitd20031bb63dd6dde35feb7845eaf17c620eef120 (patch)
treeb36fd419c0ef1459ef4cfe1b000e1b4a3c65e6f2 /tools/perf/util/auxtrace.h
parent0ad21f6869222fd7fd7c63f02febea082e801fc2 (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.h41
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 */
316static 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
298static inline u64 auxtrace_mmap__read_head(struct auxtrace_mmap *mm) 326static 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,
346int auxtrace_mmap__read(struct auxtrace_mmap *mm, struct auxtrace_record *itr, 374int 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
377int 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
349int auxtrace_queues__init(struct auxtrace_queues *queues); 382int auxtrace_queues__init(struct auxtrace_queues *queues);
350int auxtrace_queues__add_event(struct auxtrace_queues *queues, 383int 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);
383struct auxtrace_record *auxtrace_record__init(struct perf_evlist *evlist, 416struct auxtrace_record *auxtrace_record__init(struct perf_evlist *evlist,
384 int *err); 417 int *err);
385 418
419int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,
420 struct record_opts *opts,
421 const char *str);
386int auxtrace_record__options(struct auxtrace_record *itr, 422int 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);
394void auxtrace_record__free(struct auxtrace_record *itr); 430void auxtrace_record__free(struct auxtrace_record *itr);
431int auxtrace_record__snapshot_start(struct auxtrace_record *itr);
432int auxtrace_record__snapshot_finish(struct auxtrace_record *itr);
433int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,
434 struct auxtrace_mmap *mm,
435 unsigned char *data, u64 *head, u64 *old);
395u64 auxtrace_record__reference(struct auxtrace_record *itr); 436u64 auxtrace_record__reference(struct auxtrace_record *itr);
396 437
397int auxtrace_index__auxtrace_event(struct list_head *head, union perf_event *event, 438int auxtrace_index__auxtrace_event(struct list_head *head, union perf_event *event,