aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/tests/bpf-script-example.c
diff options
context:
space:
mode:
authorJames Clark <[email protected]>2023-01-20 14:37:01 +0000
committerArnaldo Carvalho de Melo <[email protected]>2023-01-22 21:17:46 +0000
commit5670ebf54bd26482f57a094c53bdc562c106e0a9 (patch)
tree9b3f2bbf649bfc582f469bbaf9ff5eab7b26ee2b /tools/perf/tests/bpf-script-example.c
parentperf cs_etm: Set the time field in the synthetic samples (diff)
downloadkernel-5670ebf54bd26482f57a094c53bdc562c106e0a9.tar.gz
kernel-5670ebf54bd26482f57a094c53bdc562c106e0a9.zip
perf cs-etm: Ensure that Coresight timestamps don't go backwards
There are some edge cases around estimated timestamps that can result in them going backwards. One is that after a discontinuity, the last used timestamp is set to 0. The duration of the next range is then subtracted which could result in an earlier timestamp than the last instruction. Fix this by not resetting the last timestamp used on a discontinuity, and make sure that new estimated timestamps are clamped to be later than that. Another case is that estimated timestamps could compound over time to end up being more than the next real timestamp in the trace. Fix this by clamping the estimates in cs_etm_decoder__do_soft_timestamp() to be no later than it. cs_etm_decoder__do_soft_timestamp() also updated next_cs_timestamp, which meant that the next real timestamp was lost and not stored anywhere. Fix that by only updating cs_timestamp for estimates and keep next_cs_timestamp untouched. Finally, use next_cs_timestamp to signify if a timestamp has been received previously. Because cs_timestamp has the first range subtracted, it could technically go to 0 which would break the logic. Testing ======= It can be verified that timestamps don't go backwards when tracing on a single core with the following commands. Across multiple cores it's expected that timestamps are interleaved: $ perf record -e cs_etm/@tmc_etr0/k -C 4 taskset -c 4 sleep 1 $ perf script --itrace=i1ns --ns -Fcomm,tid,pid,time,cpu,event,ip,sym,addr,symoff,flags,callindent > itrace $ sed 's/://g' itrace | awk -F ' ' ' { print $4 } ' | awk '{ if ($1 < prev) { print "line:" NR " " $0 } {prev=$1}}' Reported-by: Tanmay Jagdale <[email protected]> Signed-off-by: James Clark <[email protected]> Acked-by: Suzuki Poulouse <[email protected]> Tested-by: Tanmay Jagdale <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Bharat Bhushan <[email protected]> Cc: George Cherian <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: John Garry <[email protected]> Cc: Leo Yan <[email protected]> Cc: Linu Cherian <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Mathieu Poirier <[email protected]> Cc: Mike Leach <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Sunil Kovvuri Goutham <[email protected]> Cc: Will Deacon <[email protected]> Cc: [email protected] Cc: [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Diffstat (limited to 'tools/perf/tests/bpf-script-example.c')
0 files changed, 0 insertions, 0 deletions