forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 cde9070d9970eef1f7ec2360586c802a16230ad8
kernel/tools/perf/arch/arm64/util/arm-spe.c
....@@ -8,17 +8,20 @@
88 #include <linux/types.h>
99 #include <linux/bitops.h>
1010 #include <linux/log2.h>
11
+#include <linux/zalloc.h>
1112 #include <time.h>
1213
13
-#include "../../util/cpumap.h"
14
-#include "../../util/evsel.h"
15
-#include "../../util/evlist.h"
16
-#include "../../util/session.h"
17
-#include "../../util/util.h"
18
-#include "../../util/pmu.h"
19
-#include "../../util/debug.h"
20
-#include "../../util/auxtrace.h"
21
-#include "../../util/arm-spe.h"
14
+#include "../../../util/cpumap.h"
15
+#include "../../../util/event.h"
16
+#include "../../../util/evsel.h"
17
+#include "../../../util/evlist.h"
18
+#include "../../../util/session.h"
19
+#include <internal/lib.h> // page_size
20
+#include "../../../util/pmu.h"
21
+#include "../../../util/debug.h"
22
+#include "../../../util/auxtrace.h"
23
+#include "../../../util/record.h"
24
+#include "../../../util/arm-spe.h"
2225
2326 #define KiB(x) ((x) * 1024)
2427 #define MiB(x) ((x) * 1024 * 1024)
....@@ -26,19 +29,19 @@
2629 struct arm_spe_recording {
2730 struct auxtrace_record itr;
2831 struct perf_pmu *arm_spe_pmu;
29
- struct perf_evlist *evlist;
32
+ struct evlist *evlist;
3033 };
3134
3235 static size_t
3336 arm_spe_info_priv_size(struct auxtrace_record *itr __maybe_unused,
34
- struct perf_evlist *evlist __maybe_unused)
37
+ struct evlist *evlist __maybe_unused)
3538 {
3639 return ARM_SPE_AUXTRACE_PRIV_SIZE;
3740 }
3841
3942 static int arm_spe_info_fill(struct auxtrace_record *itr,
4043 struct perf_session *session,
41
- struct auxtrace_info_event *auxtrace_info,
44
+ struct perf_record_auxtrace_info *auxtrace_info,
4245 size_t priv_size)
4346 {
4447 struct arm_spe_recording *sper =
....@@ -48,7 +51,7 @@
4851 if (priv_size != ARM_SPE_AUXTRACE_PRIV_SIZE)
4952 return -EINVAL;
5053
51
- if (!session->evlist->nr_mmaps)
54
+ if (!session->evlist->core.nr_mmaps)
5255 return -EINVAL;
5356
5457 auxtrace_info->type = PERF_AUXTRACE_ARM_SPE;
....@@ -58,27 +61,27 @@
5861 }
5962
6063 static int arm_spe_recording_options(struct auxtrace_record *itr,
61
- struct perf_evlist *evlist,
64
+ struct evlist *evlist,
6265 struct record_opts *opts)
6366 {
6467 struct arm_spe_recording *sper =
6568 container_of(itr, struct arm_spe_recording, itr);
6669 struct perf_pmu *arm_spe_pmu = sper->arm_spe_pmu;
67
- struct perf_evsel *evsel, *arm_spe_evsel = NULL;
68
- bool privileged = geteuid() == 0 || perf_event_paranoid() < 0;
69
- struct perf_evsel *tracking_evsel;
70
+ struct evsel *evsel, *arm_spe_evsel = NULL;
71
+ bool privileged = perf_event_paranoid_check(-1);
72
+ struct evsel *tracking_evsel;
7073 int err;
7174
7275 sper->evlist = evlist;
7376
7477 evlist__for_each_entry(evlist, evsel) {
75
- if (evsel->attr.type == arm_spe_pmu->type) {
78
+ if (evsel->core.attr.type == arm_spe_pmu->type) {
7679 if (arm_spe_evsel) {
7780 pr_err("There may be only one " ARM_SPE_PMU_NAME "x event\n");
7881 return -EINVAL;
7982 }
80
- evsel->attr.freq = 0;
81
- evsel->attr.sample_period = 1;
83
+ evsel->core.attr.freq = 0;
84
+ evsel->core.attr.sample_period = 1;
8285 arm_spe_evsel = evsel;
8386 opts->full_auxtrace = true;
8487 }
....@@ -117,23 +120,29 @@
117120 */
118121 perf_evlist__to_front(evlist, arm_spe_evsel);
119122
120
- perf_evsel__set_sample_bit(arm_spe_evsel, CPU);
121
- perf_evsel__set_sample_bit(arm_spe_evsel, TIME);
122
- perf_evsel__set_sample_bit(arm_spe_evsel, TID);
123
+ evsel__set_sample_bit(arm_spe_evsel, CPU);
124
+ evsel__set_sample_bit(arm_spe_evsel, TIME);
125
+ evsel__set_sample_bit(arm_spe_evsel, TID);
126
+
127
+ /*
128
+ * Set this only so that perf report knows that SPE generates memory info. It has no effect
129
+ * on the opening of the event or the SPE data produced.
130
+ */
131
+ evsel__set_sample_bit(arm_spe_evsel, DATA_SRC);
123132
124133 /* Add dummy event to keep tracking */
125134 err = parse_events(evlist, "dummy:u", NULL);
126135 if (err)
127136 return err;
128137
129
- tracking_evsel = perf_evlist__last(evlist);
138
+ tracking_evsel = evlist__last(evlist);
130139 perf_evlist__set_tracking_event(evlist, tracking_evsel);
131140
132
- tracking_evsel->attr.freq = 0;
133
- tracking_evsel->attr.sample_period = 1;
134
- perf_evsel__set_sample_bit(tracking_evsel, TIME);
135
- perf_evsel__set_sample_bit(tracking_evsel, CPU);
136
- perf_evsel__reset_sample_bit(tracking_evsel, BRANCH_STACK);
141
+ tracking_evsel->core.attr.freq = 0;
142
+ tracking_evsel->core.attr.sample_period = 1;
143
+ evsel__set_sample_bit(tracking_evsel, TIME);
144
+ evsel__set_sample_bit(tracking_evsel, CPU);
145
+ evsel__reset_sample_bit(tracking_evsel, BRANCH_STACK);
137146
138147 return 0;
139148 }
....@@ -155,20 +164,6 @@
155164 free(sper);
156165 }
157166
158
-static int arm_spe_read_finish(struct auxtrace_record *itr, int idx)
159
-{
160
- struct arm_spe_recording *sper =
161
- container_of(itr, struct arm_spe_recording, itr);
162
- struct perf_evsel *evsel;
163
-
164
- evlist__for_each_entry(sper->evlist, evsel) {
165
- if (evsel->attr.type == sper->arm_spe_pmu->type)
166
- return perf_evlist__enable_event_idx(sper->evlist,
167
- evsel, idx);
168
- }
169
- return -EINVAL;
170
-}
171
-
172167 struct auxtrace_record *arm_spe_recording_init(int *err,
173168 struct perf_pmu *arm_spe_pmu)
174169 {
....@@ -186,12 +181,13 @@
186181 }
187182
188183 sper->arm_spe_pmu = arm_spe_pmu;
184
+ sper->itr.pmu = arm_spe_pmu;
189185 sper->itr.recording_options = arm_spe_recording_options;
190186 sper->itr.info_priv_size = arm_spe_info_priv_size;
191187 sper->itr.info_fill = arm_spe_info_fill;
192188 sper->itr.free = arm_spe_recording_free;
193189 sper->itr.reference = arm_spe_reference;
194
- sper->itr.read_finish = arm_spe_read_finish;
190
+ sper->itr.read_finish = auxtrace_record__read_finish;
195191 sper->itr.alignment = 0;
196192
197193 *err = 0;