Skip to content

Commit 33f3bc4

Browse files
ahunter6gregkh
authored andcommitted
perf intel-pt: Fix last_ip usage
commit ee14ac0 upstream. 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 <[email protected]> Cc: Andi Kleen <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 01ac8af commit 33f3bc4

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

tools/perf/util/intel-pt-decoder/intel-pt-decoder.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ struct intel_pt_decoder {
110110
bool have_tma;
111111
bool have_cyc;
112112
bool fixup_last_mtc;
113+
bool have_last_ip;
113114
uint64_t pos;
114115
uint64_t last_ip;
115116
uint64_t ip;
@@ -417,6 +418,7 @@ static uint64_t intel_pt_calc_ip(const struct intel_pt_pkt *packet,
417418
static inline void intel_pt_set_last_ip(struct intel_pt_decoder *decoder)
418419
{
419420
decoder->last_ip = intel_pt_calc_ip(&decoder->packet, decoder->last_ip);
421+
decoder->have_last_ip = true;
420422
}
421423

422424
static inline void intel_pt_set_ip(struct intel_pt_decoder *decoder)
@@ -1640,6 +1642,8 @@ static int intel_pt_walk_trace(struct intel_pt_decoder *decoder)
16401642
break;
16411643

16421644
case INTEL_PT_PSB:
1645+
decoder->last_ip = 0;
1646+
decoder->have_last_ip = true;
16431647
intel_pt_clear_stack(&decoder->stack);
16441648
err = intel_pt_walk_psbend(decoder);
16451649
if (err == -EAGAIN)
@@ -1720,7 +1724,7 @@ static int intel_pt_walk_trace(struct intel_pt_decoder *decoder)
17201724

17211725
static inline bool intel_pt_have_ip(struct intel_pt_decoder *decoder)
17221726
{
1723-
return decoder->last_ip || decoder->packet.count == 0 ||
1727+
return decoder->have_last_ip || decoder->packet.count == 0 ||
17241728
decoder->packet.count == 3 || decoder->packet.count == 6;
17251729
}
17261730

@@ -1850,7 +1854,7 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
18501854
if (decoder->ip)
18511855
return 0;
18521856
}
1853-
if (decoder->packet.count)
1857+
if (decoder->packet.count && decoder->have_last_ip)
18541858
intel_pt_set_last_ip(decoder);
18551859
break;
18561860

@@ -1900,6 +1904,8 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
19001904
break;
19011905

19021906
case INTEL_PT_PSB:
1907+
decoder->last_ip = 0;
1908+
decoder->have_last_ip = true;
19031909
intel_pt_clear_stack(&decoder->stack);
19041910
err = intel_pt_walk_psb(decoder);
19051911
if (err)
@@ -2036,6 +2042,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
20362042

20372043
decoder->pge = false;
20382044
decoder->continuous_period = false;
2045+
decoder->have_last_ip = false;
20392046
decoder->last_ip = 0;
20402047
decoder->ip = 0;
20412048
intel_pt_clear_stack(&decoder->stack);
@@ -2044,6 +2051,7 @@ static int intel_pt_sync(struct intel_pt_decoder *decoder)
20442051
if (err)
20452052
return err;
20462053

2054+
decoder->have_last_ip = true;
20472055
decoder->pkt_state = INTEL_PT_STATE_NO_IP;
20482056

20492057
err = intel_pt_walk_psb(decoder);
@@ -2086,6 +2094,7 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder)
20862094
err = intel_pt_sync(decoder);
20872095
break;
20882096
case INTEL_PT_STATE_NO_IP:
2097+
decoder->have_last_ip = false;
20892098
decoder->last_ip = 0;
20902099
decoder->ip = 0;
20912100
/* Fall through */

0 commit comments

Comments
 (0)