diff options
author | Adrian Hunter <adrian.hunter@intel.com> | 2016-03-08 03:38:44 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-03-31 09:52:24 -0400 |
commit | 46bc29b970f0011a9099077f1db8f3540aa829fe (patch) | |
tree | 938c97e15993470419809aa90273f7311e2180d6 /tools/perf/arch | |
parent | 39878d492c049796202b70dc0ef14449cafa3cb4 (diff) |
perf tools: Add time conversion event
Intel PT uses the time members from the perf_event_mmap_page to convert
between TSC and perf time.
Due to a lack of foresight when Intel PT was implemented, those time
members were recorded in the (implementation dependent) AUXTRACE_INFO
event, the structure of which is generally inaccessible outside of the
Intel PT decoder. However now the conversion between TSC and perf time
is needed when processing a jitdump file when Intel PT has been used for
tracing.
So add a user event to record the time members. 'perf record' will
synthesize the event if the information is available. And session
processing will put a copy of the event on the session so that tools
like 'perf inject' can easily access it.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1457426324-30158-1-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/arch')
-rw-r--r-- | tools/perf/arch/x86/util/tsc.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/tools/perf/arch/x86/util/tsc.c b/tools/perf/arch/x86/util/tsc.c index fd2868490d00..70ff7c14bea6 100644 --- a/tools/perf/arch/x86/util/tsc.c +++ b/tools/perf/arch/x86/util/tsc.c | |||
@@ -46,3 +46,34 @@ u64 rdtsc(void) | |||
46 | 46 | ||
47 | return low | ((u64)high) << 32; | 47 | return low | ((u64)high) << 32; |
48 | } | 48 | } |
49 | |||
50 | int perf_event__synth_time_conv(const struct perf_event_mmap_page *pc, | ||
51 | struct perf_tool *tool, | ||
52 | perf_event__handler_t process, | ||
53 | struct machine *machine) | ||
54 | { | ||
55 | union perf_event event = { | ||
56 | .time_conv = { | ||
57 | .header = { | ||
58 | .type = PERF_RECORD_TIME_CONV, | ||
59 | .size = sizeof(struct time_conv_event), | ||
60 | }, | ||
61 | }, | ||
62 | }; | ||
63 | struct perf_tsc_conversion tc; | ||
64 | int err; | ||
65 | |||
66 | err = perf_read_tsc_conversion(pc, &tc); | ||
67 | if (err == -EOPNOTSUPP) | ||
68 | return 0; | ||
69 | if (err) | ||
70 | return err; | ||
71 | |||
72 | pr_debug2("Synthesizing TSC conversion information\n"); | ||
73 | |||
74 | event.time_conv.time_mult = tc.time_mult; | ||
75 | event.time_conv.time_shift = tc.time_shift; | ||
76 | event.time_conv.time_zero = tc.time_zero; | ||
77 | |||
78 | return process(tool, &event, NULL, machine); | ||
79 | } | ||