lkml.org 
[lkml]   [2020]   [Jul]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V2 01/12] perf intel-pt: Fix FUP packet state
    Date
    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>
    Cc: stable@vger.kernel.org
    ---
    .../util/intel-pt-decoder/intel-pt-decoder.c | 21 +++++++------------
    1 file changed, 7 insertions(+), 14 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 f8ccfd6be0ee..75c4bd74d521 100644
    --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
    +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
    @@ -1164,6 +1164,7 @@ static int intel_pt_walk_fup(struct intel_pt_decoder *decoder)
    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;
    @@ -1942,17 +1943,13 @@ static int intel_pt_walk_trace(struct intel_pt_decoder *decoder)
    }
    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;
    @@ -2599,15 +2596,11 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
    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);
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-07-10 17:13    [W:2.931 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site