CBR events can result in a duplicate branch event, because the state type
defaults to a branch. Fix by clearing the state type.

Example: trace 'sleep' and hope for a frequency change

 Before:

   $ perf record -e intel_pt//u sleep 0.1
   [ perf record: Woken up 1 times to write data ]
   [ perf record: Captured and wrote 0.034 MB perf.data ]
   $ perf script --itrace=bpe > before.txt

 After:

   $ perf script --itrace=bpe > after.txt
   $ diff -u before.txt after.txt
   --- before.txt  2020-07-07 14:42:18.191508098 +0300
   +++ after.txt   2020-07-07 14:42:36.587891753 +0300
   @@ -29673,7 +29673,6 @@
               sleep 93431 [007] 15411.619905:          1  branches:u:          
       0 [unknown] ([unknown]) =>     7f0818abb2e0 
clock_nanosleep@@GLIBC_2.17+0x0 (/usr/lib/x86_64-linux-gnu/libc-2.31.so)
               sleep 93431 [007] 15411.619905:          1  branches:u:      
7f0818abb30c clock_nanosleep@@GLIBC_2.17+0x2c 
(/usr/lib/x86_64-linux-gnu/libc-2.31.so) =>                0 [unknown] 
([unknown])
               sleep 93431 [007] 15411.720069:         cbr:  cbr: 15 freq: 1507 
MHz ( 56%)         7f0818abb30c clock_nanosleep@@GLIBC_2.17+0x2c 
(/usr/lib/x86_64-linux-gnu/libc-2.31.so)
   -           sleep 93431 [007] 15411.720069:          1  branches:u:      
7f0818abb30c clock_nanosleep@@GLIBC_2.17+0x2c 
(/usr/lib/x86_64-linux-gnu/libc-2.31.so) =>                0 [unknown] 
([unknown])
               sleep 93431 [007] 15411.720076:          1  branches:u:          
       0 [unknown] ([unknown]) =>     7f0818abb30e 
clock_nanosleep@@GLIBC_2.17+0x2e (/usr/lib/x86_64-linux-gnu/libc-2.31.so)
               sleep 93431 [007] 15411.720077:          1  branches:u:      
7f0818abb323 clock_nanosleep@@GLIBC_2.17+0x43 
(/usr/lib/x86_64-linux-gnu/libc-2.31.so) =>     7f0818ac0eb7 __nanosleep+0x17 
(/usr/lib/x86_64-linux-gnu/libc-2.31.so)
               sleep 93431 [007] 15411.720077:          1  branches:u:      
7f0818ac0ebf __nanosleep+0x1f (/usr/lib/x86_64-linux-gnu/libc-2.31.so) =>     
55cb7e4c2827 rpl_nanosleep+0x97 (/usr/bin/sleep)

Signed-off-by: Adrian Hunter <[email protected]>
Fixes: 91de8684f1cff ("perf intel-pt: Cater for CBR change in PSB+")
Fixes: abe5a1d3e4bee ("perf intel-pt: Decoder to output CBR changes 
immediately")
Cc: [email protected]
---
 tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c 
b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
index 75c4bd74d521..7ffcbd6fcd1a 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
@@ -1977,8 +1977,10 @@ static int intel_pt_walk_trace(struct intel_pt_decoder 
*decoder)
                         * possibility of another CBR change that gets caught up
                         * in the PSB+.
                         */
-                       if (decoder->cbr != decoder->cbr_seen)
+                       if (decoder->cbr != decoder->cbr_seen) {
+                               decoder->state.type = 0;
                                return 0;
+                       }
                        break;
 
                case INTEL_PT_PIP:
@@ -2019,8 +2021,10 @@ static int intel_pt_walk_trace(struct intel_pt_decoder 
*decoder)
 
                case INTEL_PT_CBR:
                        intel_pt_calc_cbr(decoder);
-                       if (decoder->cbr != decoder->cbr_seen)
+                       if (decoder->cbr != decoder->cbr_seen) {
+                               decoder->state.type = 0;
                                return 0;
+                       }
                        break;
 
                case INTEL_PT_MODE_EXEC:
-- 
2.17.1

Reply via email to