lkml.org 
[lkml]   [2020]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 193/228] perf intel-pt: Fix FUP packet state
    Date
    From: Adrian Hunter <adrian.hunter@intel.com>

    commit 401136bb084fd021acd9f8c51b52fe0a25e326b2 upstream.

    While walking code towards a FUP ip, the packet state is
    INTEL_PT_STATE_FUP or INTEL_PT_STATE_FUP_NO_TIP. That was mishandled
    resulting in the state becoming INTEL_PT_STATE_IN_SYNC prematurely. The
    result was an occasional lost EXSTOP event.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    Reviewed-by: Andi Kleen <ak@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: stable@vger.kernel.org
    Link: http://lore.kernel.org/lkml/20200710151104.15137-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 | 21 ++++++--------------
    1 file changed, 7 insertions(+), 14 deletions(-)

    --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
    +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
    @@ -1129,6 +1129,7 @@ static int intel_pt_walk_fup(struct inte
    return 0;
    if (err == -EAGAIN ||
    intel_pt_fup_with_nlip(decoder, &intel_pt_insn, ip, err)) {
    + decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
    if (intel_pt_fup_event(decoder))
    return 0;
    return -EAGAIN;
    @@ -1780,17 +1781,13 @@ next:
    }
    if (decoder->set_fup_mwait)
    no_tip = true;
    + if (no_tip)
    + decoder->pkt_state = INTEL_PT_STATE_FUP_NO_TIP;
    + else
    + decoder->pkt_state = INTEL_PT_STATE_FUP;
    err = intel_pt_walk_fup(decoder);
    - if (err != -EAGAIN) {
    - if (err)
    - return err;
    - if (no_tip)
    - decoder->pkt_state =
    - INTEL_PT_STATE_FUP_NO_TIP;
    - else
    - decoder->pkt_state = INTEL_PT_STATE_FUP;
    - return 0;
    - }
    + if (err != -EAGAIN)
    + return err;
    if (no_tip) {
    no_tip = false;
    break;
    @@ -2375,15 +2372,11 @@ const struct intel_pt_state *intel_pt_de
    err = intel_pt_walk_tip(decoder);
    break;
    case INTEL_PT_STATE_FUP:
    - decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
    err = intel_pt_walk_fup(decoder);
    if (err == -EAGAIN)
    err = intel_pt_walk_fup_tip(decoder);
    - else if (!err)
    - decoder->pkt_state = INTEL_PT_STATE_FUP;
    break;
    case INTEL_PT_STATE_FUP_NO_TIP:
    - decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
    err = intel_pt_walk_fup(decoder);
    if (err == -EAGAIN)
    err = intel_pt_walk_trace(decoder);

    \
     
     \ /
      Last update: 2020-08-20 12:17    [W:4.038 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site