mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 06:14:39 +01:00
perf tsc: Support cap_user_time_short for event TIME_CONV
The synthesized event TIME_CONV doesn't contain the complete parameters for counters, this will lead to wrong conversion between counter cycles and timestamp. This patch extends event TIME_CONV to record flags 'cap_user_time_zero' which is used to indicate the counter parameters are valid or not, if not will directly return 0 for timestamp calculation. And record the flag 'cap_user_time_short' and its relevant fields 'time_cycles' and 'time_mask' for cycle calibration. Signed-off-by: Leo Yan <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Andi Kleen <[email protected]> Cc: Gustavo A. R. Silva <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: John Garry <[email protected]> Cc: Kemeng Shi <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Mathieu Poirier <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Nick Gasson <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Remi Bernon <[email protected]> Cc: Stephane Eranian <[email protected]> Cc: Steve Maclean <[email protected]> Cc: Will Deacon <[email protected]> Cc: Zou Wei <[email protected]> Cc: [email protected] Link: http://lore.kernel.org/lkml/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
This commit is contained in:
1 parent
78a93d4cec
commit
d110162caf
3 files changed
+16
-4
No files matched your search
@@ -324,6 +324,10 @@ struct perf_record_time_conv {
|
||||
__u64 time_shift;
|
||||
__u64 time_mult;
|
||||
__u64 time_zero;
|
||||
__u64 time_cycles;
|
||||
__u64 time_mask;
|
||||
bool cap_user_time_zero;
|
||||
bool cap_user_time_short;
|
||||
};
|
||||
|
||||
struct perf_record_header_feature {
|
||||
|
||||
@@ -374,11 +374,15 @@ static uint64_t convert_timestamp(struct jit_buf_desc *jd, uint64_t timestamp)
|
||||
if (!jd->use_arch_timestamp)
|
||||
return timestamp;
|
||||
|
||||
tc.time_shift = jd->session->time_conv.time_shift;
|
||||
tc.time_mult = jd->session->time_conv.time_mult;
|
||||
tc.time_zero = jd->session->time_conv.time_zero;
|
||||
tc.time_shift = jd->session->time_conv.time_shift;
|
||||
tc.time_mult = jd->session->time_conv.time_mult;
|
||||
tc.time_zero = jd->session->time_conv.time_zero;
|
||||
tc.time_cycles = jd->session->time_conv.time_cycles;
|
||||
tc.time_mask = jd->session->time_conv.time_mask;
|
||||
tc.cap_user_time_zero = jd->session->time_conv.cap_user_time_zero;
|
||||
tc.cap_user_time_short = jd->session->time_conv.cap_user_time_short;
|
||||
|
||||
if (!tc.time_mult)
|
||||
if (!tc.cap_user_time_zero)
|
||||
return 0;
|
||||
|
||||
return tsc_to_perf_time(timestamp, &tc);
|
||||
|
||||
@@ -98,6 +98,10 @@ int perf_event__synth_time_conv(const struct perf_event_mmap_page *pc,
|
||||
event.time_conv.time_mult = tc.time_mult;
|
||||
event.time_conv.time_shift = tc.time_shift;
|
||||
event.time_conv.time_zero = tc.time_zero;
|
||||
event.time_conv.time_cycles = tc.time_cycles;
|
||||
event.time_conv.time_mask = tc.time_mask;
|
||||
event.time_conv.cap_user_time_zero = tc.cap_user_time_zero;
|
||||
event.time_conv.cap_user_time_short = tc.cap_user_time_short;
|
||||
|
||||
return process(tool, &event, NULL, machine);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user