aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/intel-pt-decoder
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2017-05-26 04:17:06 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-06-21 10:35:45 -0400
commitee14ac0ef6827cd6f9a572cc83dd0191ea17812c (patch)
tree3b6fecdc06348f419eea3f58672d22b7ae0c82d7 /tools/perf/util/intel-pt-decoder
parentad7167a8cd174ba7d8c0d0ed8d8410521206d104 (diff)
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@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: stable@vger.kernel.org Link: http://lkml.kernel.org/r/1495786658-18063-6-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/intel-pt-decoder')
-rw-r--r--tools/perf/util/intel-pt-decoder/intel-pt-decoder.c13
1 files changed, 11 insertions, 2 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 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 {
111 bool have_tma; 111 bool have_tma;
112 bool have_cyc; 112 bool have_cyc;
113 bool fixup_last_mtc; 113 bool fixup_last_mtc;
114 bool have_last_ip;
114 uint64_t pos; 115 uint64_t pos;
115 uint64_t last_ip; 116 uint64_t last_ip;
116 uint64_t ip; 117 uint64_t ip;
@@ -419,6 +420,7 @@ static uint64_t intel_pt_calc_ip(const struct intel_pt_pkt *packet,
419static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder) 420static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder)
420{ 421{
421 decoder->last_ip = intel_pt_calc_ip(&decoder->packet, decoder->last_ip); 422 decoder->last_ip = intel_pt_calc_ip(&decoder->packet, decoder->last_ip);
423 decoder->have_last_ip = true;
422} 424}
423 425
424static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder) 426static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder)
@@ -1672,6 +1674,8 @@ next:
1672 break; 1674 break;
1673 1675
1674 case INTEL_PT_PSB: 1676 case INTEL_PT_PSB:
1677 decoder->last_ip = 0;
1678 decoder->have_last_ip = true;
1675 intel_pt_clear_stack(&decoder->stack); 1679 intel_pt_clear_stack(&decoder->stack);
1676 err = intel_pt_walk_psbend(decoder); 1680 err = intel_pt_walk_psbend(decoder);
1677 if (err == -EAGAIN) 1681 if (err == -EAGAIN)
@@ -1752,7 +1756,7 @@ next:
1752 1756
1753static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder) 1757static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder)
1754{ 1758{
1755 return decoder->last_ip || decoder->packet.count == 0 || 1759 return decoder->have_last_ip || decoder->packet.count == 0 ||
1756 decoder->packet.count == 3 || decoder->packet.count == 6; 1760 decoder->packet.count == 3 || decoder->packet.count == 6;
1757} 1761}
1758 1762
@@ -1882,7 +1886,7 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
1882 if (decoder->ip) 1886 if (decoder->ip)
1883 return 0; 1887 return 0;
1884 } 1888 }
1885 if (decoder->packet.count) 1889 if (decoder->packet.count && decoder->have_last_ip)
1886 intel_pt_set_last_ip(decoder); 1890 intel_pt_set_last_ip(decoder);
1887 break; 1891 break;
1888 1892
@@ -1932,6 +1936,8 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
1932 break; 1936 break;
1933 1937
1934 case INTEL_PT_PSB: 1938 case INTEL_PT_PSB:
1939 decoder->last_ip = 0;
1940 decoder->have_last_ip = true;
1935 intel_pt_clear_stack(&decoder->stack); 1941 intel_pt_clear_stack(&decoder->stack);
1936 err = intel_pt_walk_psb(decoder); 1942 err = intel_pt_walk_psb(decoder);
1937 if (err) 1943 if (err)
@@ -2066,6 +2072,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
2066 2072
2067 decoder->pge = false; 2073 decoder->pge = false;
2068 decoder->continuous_period = false; 2074 decoder->continuous_period = false;
2075 decoder->have_last_ip = false;
2069 decoder->last_ip = 0; 2076 decoder->last_ip = 0;
2070 decoder->ip = 0; 2077 decoder->ip = 0;
2071 intel_pt_clear_stack(&decoder->stack); 2078 intel_pt_clear_stack(&decoder->stack);
@@ -2074,6 +2081,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
2074 if (err) 2081 if (err)
2075 return err; 2082 return err;
2076 2083
2084 decoder->have_last_ip = true;
2077 decoder->pkt_state = INTEL_PT_STATE_NO_IP; 2085 decoder->pkt_state = INTEL_PT_STATE_NO_IP;
2078 2086
2079 err = intel_pt_walk_psb(decoder); 2087 err = intel_pt_walk_psb(decoder);
@@ -2116,6 +2124,7 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
2116 err = intel_pt_sync(decoder); 2124 err = intel_pt_sync(decoder);
2117 break; 2125 break;
2118 case INTEL_PT_STATE_NO_IP: 2126 case INTEL_PT_STATE_NO_IP:
2127 decoder->have_last_ip = false;
2119 decoder->last_ip = 0; 2128 decoder->last_ip = 0;
2120 decoder->ip = 0; 2129 decoder->ip = 0;
2121 /* Fall through */ 2130 /* Fall through */