From: Adrian Hunter <adrian.hun...@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.hun...@intel.com>
Reviewed-by: Andi Kleen <a...@linux.intel.com>
Cc: Jiri Olsa <jo...@redhat.com>
Cc: sta...@vger.kernel.org
Link: http://lore.kernel.org/lkml/20200710151104.15137-2-adrian.hun...@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <a...@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gre...@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);


Reply via email to