| From 7ba8fa20e26eb3c0c04d747f7fd2223694eac4d5 Mon Sep 17 00:00:00 2001 |
| From: Adrian Hunter <adrian.hunter@intel.com> |
| Date: Fri, 10 May 2019 15:41:41 +0300 |
| Subject: perf intel-pt: Fix instructions sampling rate |
| |
| From: Adrian Hunter <adrian.hunter@intel.com> |
| |
| commit 7ba8fa20e26eb3c0c04d747f7fd2223694eac4d5 upstream. |
| |
| The timestamp used to determine if an instruction sample is made, is an |
| estimate based on the number of instructions since the last known |
| timestamp. A consequence is that it might go backwards, which results in |
| extra samples. Change it so that a sample is only made when the |
| timestamp goes forwards. |
| |
| Note this does not affect a sampling period of 0 or sampling periods |
| specified as a count of instructions. |
| |
| Example: |
| |
| Before: |
| |
| $ perf script --itrace=i10us |
| ls 13812 [003] 2167315.222583: 3270 instructions:u: 7fac71e2e494 __GI___tunables_init+0xf4 (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222667: 30902 instructions:u: 7fac71e2da0f _dl_cache_libcmp+0x2f (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222667: 10 instructions:u: 7fac71e2d9ff _dl_cache_libcmp+0x1f (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222667: 8 instructions:u: 7fac71e2d9ea _dl_cache_libcmp+0xa (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222667: 14 instructions:u: 7fac71e2d9ea _dl_cache_libcmp+0xa (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222667: 6 instructions:u: 7fac71e2d9ff _dl_cache_libcmp+0x1f (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222667: 14 instructions:u: 7fac71e2d9ff _dl_cache_libcmp+0x1f (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222667: 4 instructions:u: 7fac71e2dab2 _dl_cache_libcmp+0xd2 (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222728: 16423 instructions:u: 7fac71e2477a _dl_map_object_deps+0x1ba (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222734: 12731 instructions:u: 7fac71e27938 _dl_name_match_p+0x68 (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ... |
| |
| After: |
| $ perf script --itrace=i10us |
| ls 13812 [003] 2167315.222583: 3270 instructions:u: 7fac71e2e494 __GI___tunables_init+0xf4 (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222667: 30902 instructions:u: 7fac71e2da0f _dl_cache_libcmp+0x2f (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ls 13812 [003] 2167315.222728: 16479 instructions:u: 7fac71e2477a _dl_map_object_deps+0x1ba (/lib/x86_64-linux-gnu/ld-2.28.so) |
| ... |
| |
| Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: stable@vger.kernel.org |
| Fixes: f4aa081949e7b ("perf tools: Add Intel PT decoder") |
| Link: http://lkml.kernel.org/r/20190510124143.27054-2-adrian.hunter@intel.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 13 ++++++++++--- |
| 1 file changed, 10 insertions(+), 3 deletions(-) |
| |
| --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
| +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
| @@ -856,16 +856,20 @@ static uint64_t intel_pt_next_period(str |
| timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; |
| masked_timestamp = timestamp & decoder->period_mask; |
| if (decoder->continuous_period) { |
| - if (masked_timestamp != decoder->last_masked_timestamp) |
| + if (masked_timestamp > decoder->last_masked_timestamp) |
| return 1; |
| } else { |
| timestamp += 1; |
| masked_timestamp = timestamp & decoder->period_mask; |
| - if (masked_timestamp != decoder->last_masked_timestamp) { |
| + if (masked_timestamp > decoder->last_masked_timestamp) { |
| decoder->last_masked_timestamp = masked_timestamp; |
| decoder->continuous_period = true; |
| } |
| } |
| + |
| + if (masked_timestamp < decoder->last_masked_timestamp) |
| + return decoder->period_ticks; |
| + |
| return decoder->period_ticks - (timestamp - masked_timestamp); |
| } |
| |
| @@ -894,7 +898,10 @@ static void intel_pt_sample_insn(struct |
| case INTEL_PT_PERIOD_TICKS: |
| timestamp = decoder->timestamp + decoder->timestamp_insn_cnt; |
| masked_timestamp = timestamp & decoder->period_mask; |
| - decoder->last_masked_timestamp = masked_timestamp; |
| + if (masked_timestamp > decoder->last_masked_timestamp) |
| + decoder->last_masked_timestamp = masked_timestamp; |
| + else |
| + decoder->last_masked_timestamp += decoder->period_ticks; |
| break; |
| case INTEL_PT_PERIOD_NONE: |
| case INTEL_PT_PERIOD_MTC: |