It seems to be dependent on: commit e1717e0485af4f47fc4da1e979ac817f9ad61b0f Author: Adrian Hunter <adrian.hunter@xxxxxxxxx> Date: Wed Jul 20 12:00:06 2016 +0300 perf intel-pt: Fix ip compression Please take that and then this and the other 2 failures: perf intel-pt: Use FUP always when scanning for an IP perf intel-pt: Ensure never to set 'last_ip' when packet should also apply. On 22/07/17 16:06, gregkh@xxxxxxxxxxxxxxxxxxx wrote: > > The patch below does not apply to the 4.4-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. > > thanks, > > greg k-h > > ------------------ original commit in Linus's tree ------------------ > >>From ee14ac0ef6827cd6f9a572cc83dd0191ea17812c Mon Sep 17 00:00:00 2001 > From: Adrian Hunter <adrian.hunter@xxxxxxxxx> > Date: Fri, 26 May 2017 11:17:06 +0300 > Subject: [PATCH] perf intel-pt: Fix last_ip usage > > Intel PT uses IP compression based on the last IP. For decoding > purposes, 'last IP' is considered to be reset to zero whenever there is > a synchronization packet (PSB). The decoder wasn't doing that, and was > treating the zero value to mean that there was no last IP, whereas > compression can be done against the zero value. Fix by setting last_ip > to zero when a PSB is received and keep track of have_last_ip. > > Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> > Cc: Andi Kleen <ak@xxxxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > Link: http://lkml.kernel.org/r/1495786658-18063-6-git-send-email-adrian.hunter@xxxxxxxxx > Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> > > 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 f9cd3aaef488..62e2c2ad3f1d 100644 > --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c > +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c > @@ -111,6 +111,7 @@ struct intel_pt_decoder { > bool have_tma; > bool have_cyc; > bool fixup_last_mtc; > + bool have_last_ip; > uint64_t pos; > uint64_t last_ip; > uint64_t ip; > @@ -419,6 +420,7 @@ static uint64_t intel_pt_calc_ip(const struct intel_pt_pkt *packet, > static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder) > { > decoder->last_ip = intel_pt_calc_ip(&decoder->packet, decoder->last_ip); > + decoder->have_last_ip = true; > } > > static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder) > @@ -1672,6 +1674,8 @@ static int intel_pt_walk_trace(struct intel_pt_decoder *decoder) > break; > > case INTEL_PT_PSB: > + decoder->last_ip = 0; > + decoder->have_last_ip = true; > intel_pt_clear_stack(&decoder->stack); > err = intel_pt_walk_psbend(decoder); > if (err == -EAGAIN) > @@ -1752,7 +1756,7 @@ static int intel_pt_walk_trace(struct intel_pt_decoder *decoder) > > static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder) > { > - return decoder->last_ip || decoder->packet.count == 0 || > + return decoder->have_last_ip || decoder->packet.count == 0 || > decoder->packet.count == 3 || decoder->packet.count == 6; > } > > @@ -1882,7 +1886,7 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) > if (decoder->ip) > return 0; > } > - if (decoder->packet.count) > + if (decoder->packet.count && decoder->have_last_ip) > intel_pt_set_last_ip(decoder); > break; > > @@ -1932,6 +1936,8 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) > break; > > case INTEL_PT_PSB: > + decoder->last_ip = 0; > + decoder->have_last_ip = true; > intel_pt_clear_stack(&decoder->stack); > err = intel_pt_walk_psb(decoder); > if (err) > @@ -2066,6 +2072,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder) > > decoder->pge = false; > decoder->continuous_period = false; > + decoder->have_last_ip = false; > decoder->last_ip = 0; > decoder->ip = 0; > intel_pt_clear_stack(&decoder->stack); > @@ -2074,6 +2081,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder) > if (err) > return err; > > + decoder->have_last_ip = true; > decoder->pkt_state = INTEL_PT_STATE_NO_IP; > > err = intel_pt_walk_psb(decoder); > @@ -2116,6 +2124,7 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder) > err = intel_pt_sync(decoder); > break; > case INTEL_PT_STATE_NO_IP: > + decoder->have_last_ip = false; > decoder->last_ip = 0; > decoder->ip = 0; > /* Fall through */ > >