File perf-intel-pt-Fix-state-setting-when-receiving-overflow-OVF-packet.patch of Package perf
108
1
From: Adrian Hunter <adrian.hunter@intel.com>
2
Date: Fri, 10 Dec 2021 18:23:00 +0200
3
Subject: perf intel-pt: Fix state setting when receiving overflow (OVF) packet
4
Git-commit: c79ee2b2160909889df67c8801352d3e69d43a1a
5
Patch-mainline: v5.16-rc5
6
References: git-fixes
7
8
An overflow (OVF packet) is treated as an error because it represents a
9
loss of trace data, but there is no loss of synchronization, so the packet
10
state should be INTEL_PT_STATE_IN_SYNC not INTEL_PT_STATE_ERR_RESYNC.
11
12
To support that, some additional variables must be reset, and the FUP
13
packet that may follow OVF is treated as an FUP event.
14
15
Fixes: f4aa081949e7b6 ("perf tools: Add Intel PT decoder")
16
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
17
Cc: Jiri Olsa <jolsa@redhat.com>
18
Cc: stable@vger.kernel.org # v5.15+
19
Link: https://lore.kernel.org/r/20211210162303.2288710-5-adrian.hunter@intel.com
20
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
21
Signed-off-by: Tony Jones <tonyj@suse.de>
22
---
23
.../perf/util/intel-pt-decoder/intel-pt-decoder.c | 32 +++++++++++++++++++---
24
1 file changed, 28 insertions(+), 4 deletions(-)
25
26
diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
27
index 16fbbf07e367..845b0ca866a4 100644
28
--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
29
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c
30
31
decoder->state.type |= INTEL_PT_BLK_ITEMS;
32
ret = true;
33
}
34
+ if (decoder->overflow) {
35
+ decoder->overflow = false;
36
+ if (!ret && !decoder->pge) {
37
+ if (decoder->hop) {
38
+ decoder->state.type = 0;
39
+ decoder->pkt_state = INTEL_PT_STATE_RESAMPLE;
40
+ }
41
+ decoder->pge = true;
42
+ decoder->state.type |= INTEL_PT_BRANCH | INTEL_PT_TRACE_BEGIN;
43
+ decoder->state.from_ip = 0;
44
+ decoder->state.to_ip = decoder->ip;
45
+ return true;
46
+ }
47
+ }
48
if (ret) {
49
decoder->state.from_ip = decoder->ip;
50
decoder->state.to_ip = 0;
51
52
intel_pt_clear_tx_flags(decoder);
53
intel_pt_set_nr(decoder);
54
decoder->timestamp_insn_cnt = 0;
55
- decoder->pkt_state = INTEL_PT_STATE_ERR_RESYNC;
56
+ decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
57
+ decoder->state.from_ip = decoder->ip;
58
+ decoder->ip = 0;
59
+ decoder->pge = false;
60
+ decoder->set_fup_tx_flags = false;
61
+ decoder->set_fup_ptw = false;
62
+ decoder->set_fup_mwait = false;
63
+ decoder->set_fup_pwre = false;
64
+ decoder->set_fup_exstop = false;
65
+ decoder->set_fup_bep = false;
66
decoder->overflow = true;
67
return -EOVERFLOW;
68
}
69
70
71
case INTEL_PT_TIP_PGE: {
72
decoder->pge = true;
73
+ decoder->overflow = false;
74
intel_pt_mtc_cyc_cnt_pge(decoder);
75
intel_pt_set_nr(decoder);
76
if (decoder->packet.count == 0) {
77
78
decoder->set_fup_pwre = false;
79
decoder->set_fup_exstop = false;
80
decoder->set_fup_bep = false;
81
+ decoder->overflow = false;
82
83
if (!decoder->branch_enable) {
84
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
85
- decoder->overflow = false;
86
decoder->state.type = 0; /* Do not have a sample */
87
return 0;
88
}
89
90
decoder->pkt_state = INTEL_PT_STATE_RESAMPLE;
91
else
92
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
93
- decoder->overflow = false;
94
95
decoder->state.from_ip = 0;
96
decoder->state.to_ip = decoder->ip;
97
98
99
if (err) {
100
decoder->state.err = intel_pt_ext_err(err);
101
- decoder->state.from_ip = decoder->ip;
102
+ if (err != -EOVERFLOW)
103
+ decoder->state.from_ip = decoder->ip;
104
intel_pt_update_sample_time(decoder);
105
decoder->sample_tot_cyc_cnt = decoder->tot_cyc_cnt;
106
intel_pt_set_nr(decoder);
107
108