| From c954eb72b31a9dc56c99b450253ec5b121add320 Mon Sep 17 00:00:00 2001 |
| From: Adrian Hunter <adrian.hunter@intel.com> |
| Date: Wed, 19 May 2021 10:45:14 +0300 |
| Subject: perf intel-pt: Fix sample instruction bytes |
| |
| From: Adrian Hunter <adrian.hunter@intel.com> |
| |
| commit c954eb72b31a9dc56c99b450253ec5b121add320 upstream. |
| |
| The decoder reports the current instruction if it was decoded. In some |
| cases the current instruction is not decoded, in which case the instruction |
| bytes length must be set to zero. Ensure that is always done. |
| |
| Note perf script can anyway get the instruction bytes for any samples where |
| they are not present. |
| |
| Also note, that there is a redundant "ptq->insn_len = 0" statement which is |
| not removed until a subsequent patch in order to make this patch apply |
| cleanly to stable branches. |
| |
| Example: |
| |
| A machne that supports TSX is required. It will have flag "rtm". Kernel |
| parameter tsx=on may be required. |
| |
| # for w in `cat /proc/cpuinfo | grep -m1 flags `;do echo $w | grep rtm ; done |
| rtm |
| |
| Test program: |
| |
| #include <stdio.h> |
| #include <immintrin.h> |
| |
| int main() |
| { |
| int x = 0; |
| |
| if (_xbegin() == _XBEGIN_STARTED) { |
| x = 1; |
| _xabort(1); |
| } else { |
| printf("x = %d\n", x); |
| } |
| return 0; |
| } |
| |
| Compile with -mrtm i.e. |
| |
| gcc -Wall -Wextra -mrtm xabort.c -o xabort |
| |
| Record: |
| |
| perf record -e intel_pt/cyc/u --filter 'filter main @ ./xabort' ./xabort |
| |
| Before: |
| |
| # perf script --itrace=xe -F+flags,+insn,-period --xed --ns |
| xabort 1478 [007] 92161.431348581: transactions: x 400b81 main+0x14 (/root/xabort) mov $0xffffffff, %eax |
| xabort 1478 [007] 92161.431348624: transactions: tx abrt 400b93 main+0x26 (/root/xabort) mov $0xffffffff, %eax |
| |
| After: |
| |
| # perf script --itrace=xe -F+flags,+insn,-period --xed --ns |
| xabort 1478 [007] 92161.431348581: transactions: x 400b81 main+0x14 (/root/xabort) xbegin 0x6 |
| xabort 1478 [007] 92161.431348624: transactions: tx abrt 400b93 main+0x26 (/root/xabort) xabort $0x1 |
| |
| Fixes: faaa87680b25d ("perf intel-pt/bts: Report instruction bytes and length in sample") |
| Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> |
| Cc: Andi Kleen <ak@linux.intel.com> |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: stable@vger.kernel.org |
| Link: http://lore.kernel.org/lkml/20210519074515.9262-3-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.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/tools/perf/util/intel-pt.c |
| +++ b/tools/perf/util/intel-pt.c |
| @@ -707,8 +707,10 @@ static int intel_pt_walk_next_insn(struc |
| |
| *ip += intel_pt_insn->length; |
| |
| - if (to_ip && *ip == to_ip) |
| + if (to_ip && *ip == to_ip) { |
| + intel_pt_insn->length = 0; |
| goto out_no_cache; |
| + } |
| |
| if (*ip >= al.map->end) |
| break; |
| @@ -1198,6 +1200,7 @@ static void intel_pt_set_pid_tid_cpu(str |
| |
| static void intel_pt_sample_flags(struct intel_pt_queue *ptq) |
| { |
| + ptq->insn_len = 0; |
| if (ptq->state->flags & INTEL_PT_ABORT_TX) { |
| ptq->flags = PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TX_ABORT; |
| } else if (ptq->state->flags & INTEL_PT_ASYNC) { |