diff options
| author | Adrian Hunter <adrian.hunter@intel.com> | 2018-09-20 09:00:48 -0400 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2018-09-20 14:19:52 -0400 |
| commit | bea6385789b8b5e1e3228a281978ca6c4a8c70a0 (patch) | |
| tree | eee5df353539286090b341aa51f29b052763012e /tools/perf | |
| parent | c6b5da093a8ba740b71dd0052f3846016986fd21 (diff) | |
perf intel-pt: Implement decoder flags for trace begin / end
Have the Intel PT decoder implement the new Intel PT decoder flags for
trace begin / end.
Previously, the decoder would indicate begin / end by a branch from / to
zero. That hides useful information, in particular when a trace ends
with a call. That happens when using address filters, for example:
$ perf record -e intel_pt/cyc,mtc_period=0,noretcomp/u --filter='filter main @ /bin/uname ' uname Linux
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.031 MB perf.data ]
Before:
$ perf script --itrace=cre -Ftime,flags,ip,sym,symoff,addr --ns
7249.622183310: tr strt 0 [unknown] => 401590 main+0x0
7249.622183311: call 4015b9 main+0x29 => 0 [unknown]
7249.622183711: tr strt 0 [unknown] => 4015be main+0x2e
7249.622183714: call 4015c8 main+0x38 => 0 [unknown]
7249.622247731: tr strt 0 [unknown] => 4015cd main+0x3d
7249.622247760: call 4015d7 main+0x47 => 0 [unknown]
7249.622248340: tr strt 0 [unknown] => 4015dc main+0x4c
7249.622248341: call 4015e1 main+0x51 => 0 [unknown]
7249.622248681: tr strt 0 [unknown] => 4015e6 main+0x56
7249.622248682: call 4015eb main+0x5b => 0 [unknown]
7249.622248970: tr strt 0 [unknown] => 4015f0 main+0x60
7249.622248971: call 401612 main+0x82 => 0 [unknown]
7249.622249757: tr strt 0 [unknown] => 401617 main+0x87
7249.622249770: call 401847 main+0x2b7 => 0 [unknown]
7249.622250606: tr strt 0 [unknown] => 40184c main+0x2bc
7249.622250612: call 4019bf main+0x42f => 0 [unknown]
7249.622256823: tr strt 0 [unknown] => 4019c4 main+0x434
7249.622256863: call 4019f5 main+0x465 => 0 [unknown]
7249.622264217: tr strt 0 [unknown] => 4019fa main+0x46a
7249.622264235: call 401832 main+0x2a2 => 0 [unknown]
After:
$ perf script --itrace=cre -Ftime,flags,ip,sym,symoff,addr --ns
7249.622183310: tr strt 0 [unknown] => 401590 main+0x0
7249.622183311: tr end call 4015b9 main+0x29 => 401ef0 set_program_name+0x0
7249.622183711: tr strt 0 [unknown] => 4015be main+0x2e
7249.622183714: tr end call 4015c8 main+0x38 => 4014b0 setlocale@plt+0x0
7249.622247731: tr strt 0 [unknown] => 4015cd main+0x3d
7249.622247760: tr end call 4015d7 main+0x47 => 4012d0 bindtextdomain@plt+0x0
7249.622248340: tr strt 0 [unknown] => 4015dc main+0x4c
7249.622248341: tr end call 4015e1 main+0x51 => 4012b0 textdomain@plt+0x0
7249.622248681: tr strt 0 [unknown] => 4015e6 main+0x56
7249.622248682: tr end call 4015eb main+0x5b => 404340 atexit+0x0
7249.622248970: tr strt 0 [unknown] => 4015f0 main+0x60
7249.622248971: tr end call 401612 main+0x82 => 401320 getopt_long@plt+0x0
7249.622249757: tr strt 0 [unknown] => 401617 main+0x87
7249.622249770: tr end call 401847 main+0x2b7 => 401360 uname@plt+0x0
7249.622250606: tr strt 0 [unknown] => 40184c main+0x2bc
7249.622250612: tr end call 4019bf main+0x42f => 401b10 print_element+0x0
7249.622256823: tr strt 0 [unknown] => 4019c4 main+0x434
7249.622256863: tr end call 4019f5 main+0x465 => 401340 __overflow@plt+0x0
7249.622264217: tr strt 0 [unknown] => 4019fa main+0x46a
7249.622264235: tr end call 401832 main+0x2a2 => 401520 exit@plt+0x0
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lkml.kernel.org/r/20180920130048.31432-7-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
| -rw-r--r-- | tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 34 |
1 files changed, 23 insertions, 11 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 d404bed7003a..58f6a9ceb590 100644 --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | |||
| @@ -1165,7 +1165,7 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder) | |||
| 1165 | decoder->pge = false; | 1165 | decoder->pge = false; |
| 1166 | decoder->continuous_period = false; | 1166 | decoder->continuous_period = false; |
| 1167 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; | 1167 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; |
| 1168 | decoder->state.to_ip = 0; | 1168 | decoder->state.type |= INTEL_PT_TRACE_END; |
| 1169 | return 0; | 1169 | return 0; |
| 1170 | } | 1170 | } |
| 1171 | if (err == INTEL_PT_RETURN) | 1171 | if (err == INTEL_PT_RETURN) |
| @@ -1179,9 +1179,13 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder) | |||
| 1179 | decoder->continuous_period = false; | 1179 | decoder->continuous_period = false; |
| 1180 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; | 1180 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; |
| 1181 | decoder->state.from_ip = decoder->ip; | 1181 | decoder->state.from_ip = decoder->ip; |
| 1182 | decoder->state.to_ip = 0; | 1182 | if (decoder->packet.count == 0) { |
| 1183 | if (decoder->packet.count != 0) | 1183 | decoder->state.to_ip = 0; |
| 1184 | } else { | ||
| 1185 | decoder->state.to_ip = decoder->last_ip; | ||
| 1184 | decoder->ip = decoder->last_ip; | 1186 | decoder->ip = decoder->last_ip; |
| 1187 | } | ||
| 1188 | decoder->state.type |= INTEL_PT_TRACE_END; | ||
| 1185 | } else { | 1189 | } else { |
| 1186 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; | 1190 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; |
| 1187 | decoder->state.from_ip = decoder->ip; | 1191 | decoder->state.from_ip = decoder->ip; |
| @@ -1208,7 +1212,8 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder) | |||
| 1208 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; | 1212 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; |
| 1209 | decoder->ip = to_ip; | 1213 | decoder->ip = to_ip; |
| 1210 | decoder->state.from_ip = decoder->ip; | 1214 | decoder->state.from_ip = decoder->ip; |
| 1211 | decoder->state.to_ip = 0; | 1215 | decoder->state.to_ip = to_ip; |
| 1216 | decoder->state.type |= INTEL_PT_TRACE_END; | ||
| 1212 | return 0; | 1217 | return 0; |
| 1213 | } | 1218 | } |
| 1214 | intel_pt_log_at("ERROR: Conditional branch when expecting indirect branch", | 1219 | intel_pt_log_at("ERROR: Conditional branch when expecting indirect branch", |
| @@ -1640,14 +1645,15 @@ static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder) | |||
| 1640 | 1645 | ||
| 1641 | case INTEL_PT_TIP_PGD: | 1646 | case INTEL_PT_TIP_PGD: |
| 1642 | decoder->state.from_ip = decoder->ip; | 1647 | decoder->state.from_ip = decoder->ip; |
| 1643 | decoder->state.to_ip = 0; | 1648 | if (decoder->packet.count == 0) { |
| 1644 | if (decoder->packet.count != 0) { | 1649 | decoder->state.to_ip = 0; |
| 1650 | } else { | ||
| 1645 | intel_pt_set_ip(decoder); | 1651 | intel_pt_set_ip(decoder); |
| 1646 | intel_pt_log("Omitting PGD ip " x64_fmt "\n", | 1652 | decoder->state.to_ip = decoder->ip; |
| 1647 | decoder->ip); | ||
| 1648 | } | 1653 | } |
| 1649 | decoder->pge = false; | 1654 | decoder->pge = false; |
| 1650 | decoder->continuous_period = false; | 1655 | decoder->continuous_period = false; |
| 1656 | decoder->state.type |= INTEL_PT_TRACE_END; | ||
| 1651 | return 0; | 1657 | return 0; |
| 1652 | 1658 | ||
| 1653 | case INTEL_PT_TIP_PGE: | 1659 | case INTEL_PT_TIP_PGE: |
| @@ -1661,6 +1667,7 @@ static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder) | |||
| 1661 | intel_pt_set_ip(decoder); | 1667 | intel_pt_set_ip(decoder); |
| 1662 | decoder->state.to_ip = decoder->ip; | 1668 | decoder->state.to_ip = decoder->ip; |
| 1663 | } | 1669 | } |
| 1670 | decoder->state.type |= INTEL_PT_TRACE_BEGIN; | ||
| 1664 | return 0; | 1671 | return 0; |
| 1665 | 1672 | ||
| 1666 | case INTEL_PT_TIP: | 1673 | case INTEL_PT_TIP: |
| @@ -1739,6 +1746,7 @@ next: | |||
| 1739 | intel_pt_set_ip(decoder); | 1746 | intel_pt_set_ip(decoder); |
| 1740 | decoder->state.from_ip = 0; | 1747 | decoder->state.from_ip = 0; |
| 1741 | decoder->state.to_ip = decoder->ip; | 1748 | decoder->state.to_ip = decoder->ip; |
| 1749 | decoder->state.type |= INTEL_PT_TRACE_BEGIN; | ||
| 1742 | return 0; | 1750 | return 0; |
| 1743 | } | 1751 | } |
| 1744 | 1752 | ||
| @@ -2077,9 +2085,13 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder) | |||
| 2077 | decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD; | 2085 | decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD; |
| 2078 | if (intel_pt_have_ip(decoder)) | 2086 | if (intel_pt_have_ip(decoder)) |
| 2079 | intel_pt_set_ip(decoder); | 2087 | intel_pt_set_ip(decoder); |
| 2080 | if (decoder->ip) | 2088 | if (!decoder->ip) |
| 2081 | return 0; | 2089 | break; |
| 2082 | break; | 2090 | if (decoder->packet.type == INTEL_PT_TIP_PGE) |
| 2091 | decoder->state.type |= INTEL_PT_TRACE_BEGIN; | ||
| 2092 | if (decoder->packet.type == INTEL_PT_TIP_PGD) | ||
| 2093 | decoder->state.type |= INTEL_PT_TRACE_END; | ||
| 2094 | return 0; | ||
| 2083 | 2095 | ||
| 2084 | case INTEL_PT_FUP: | 2096 | case INTEL_PT_FUP: |
| 2085 | if (intel_pt_have_ip(decoder)) | 2097 | if (intel_pt_have_ip(decoder)) |
