lkml.org 
[lkml]   [2021]   [May]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 014/252] perf intel-pt: Fix transaction abort handling
    Date
    From: Adrian Hunter <adrian.hunter@intel.com>

    commit cb7987837c31b217b28089bbc78922d5c9187869 upstream.

    When adding support for power events, some handling of FUP packets was
    unified. That resulted in breaking reporting of TSX aborts, by not
    considering the associated TIP packet. Fix that.

    Example:

    A machine 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=be -F+flags,+addr,-period,-event --ns
    xabort 1478 [007] 92161.431348552: tr strt 0 [unknown] ([unknown]) => 400b6d main+0x0 (/root/xabort)
    xabort 1478 [007] 92161.431348624: jmp 400b96 main+0x29 (/root/xabort) => 400bae main+0x41 (/root/xabort)
    xabort 1478 [007] 92161.431348624: return 400bb4 main+0x47 (/root/xabort) => 400b87 main+0x1a (/root/xabort)
    xabort 1478 [007] 92161.431348637: jcc 400b8a main+0x1d (/root/xabort) => 400b98 main+0x2b (/root/xabort)
    xabort 1478 [007] 92161.431348644: tr end call 400ba9 main+0x3c (/root/xabort) => 40f690 printf+0x0 (/root/xabort)
    xabort 1478 [007] 92161.431360859: tr strt 0 [unknown] ([unknown]) => 400bae main+0x41 (/root/xabort)
    xabort 1478 [007] 92161.431360882: tr end return 400bb4 main+0x47 (/root/xabort) => 401139 __libc_start_main+0x309 (/root/xabort)

    After:

    # perf script --itrace=be -F+flags,+addr,-period,-event --ns
    xabort 1478 [007] 92161.431348552: tr strt 0 [unknown] ([unknown]) => 400b6d main+0x0 (/root/xabort)
    xabort 1478 [007] 92161.431348624: tx abrt 400b93 main+0x26 (/root/xabort) => 400b87 main+0x1a (/root/xabort)
    xabort 1478 [007] 92161.431348637: jcc 400b8a main+0x1d (/root/xabort) => 400b98 main+0x2b (/root/xabort)
    xabort 1478 [007] 92161.431348644: tr end call 400ba9 main+0x3c (/root/xabort) => 40f690 printf+0x0 (/root/xabort)
    xabort 1478 [007] 92161.431360859: tr strt 0 [unknown] ([unknown]) => 400bae main+0x41 (/root/xabort)
    xabort 1478 [007] 92161.431360882: tr end return 400bb4 main+0x47 (/root/xabort) => 401139 __libc_start_main+0x309 (/root/xabort)

    Fixes: a472e65fc490a ("perf intel-pt: Add decoder support for ptwrite and power event packets")
    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-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 | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
    +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
    @@ -1120,6 +1120,8 @@ static bool intel_pt_fup_event(struct in
    decoder->set_fup_tx_flags = false;
    decoder->tx_flags = decoder->fup_tx_flags;
    decoder->state.type = INTEL_PT_TRANSACTION;
    + if (decoder->fup_tx_flags & INTEL_PT_ABORT_TX)
    + decoder->state.type |= INTEL_PT_BRANCH;
    decoder->state.from_ip = decoder->ip;
    decoder->state.to_ip = 0;
    decoder->state.flags = decoder->fup_tx_flags;
    @@ -1194,8 +1196,10 @@ static int intel_pt_walk_fup(struct inte
    return 0;
    if (err == -EAGAIN ||
    intel_pt_fup_with_nlip(decoder, &intel_pt_insn, ip, err)) {
    + bool no_tip = decoder->pkt_state != INTEL_PT_STATE_FUP;
    +
    decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
    - if (intel_pt_fup_event(decoder))
    + if (intel_pt_fup_event(decoder) && no_tip)
    return 0;
    return -EAGAIN;
    }

    \
     
     \ /
      Last update: 2021-05-31 16:12    [W:4.393 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site