hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/tools/perf/tests/perf-record.c
....@@ -1,15 +1,18 @@
11 // SPDX-License-Identifier: GPL-2.0
22 #include <errno.h>
33 #include <inttypes.h>
4
+#include <linux/string.h>
45 /* For the CLR_() macros */
56 #include <pthread.h>
67
78 #include <sched.h>
9
+#include <perf/mmap.h>
810 #include "evlist.h"
911 #include "evsel.h"
10
-#include "perf.h"
1112 #include "debug.h"
13
+#include "record.h"
1214 #include "tests.h"
15
+#include "util/mmap.h"
1316
1417 static int sched__get_first_possible_cpu(pid_t pid, cpu_set_t *maskp)
1518 {
....@@ -50,14 +53,15 @@
5053 };
5154 cpu_set_t cpu_mask;
5255 size_t cpu_mask_size = sizeof(cpu_mask);
53
- struct perf_evlist *evlist = perf_evlist__new_dummy();
54
- struct perf_evsel *evsel;
56
+ struct evlist *evlist = perf_evlist__new_dummy();
57
+ struct evsel *evsel;
5558 struct perf_sample sample;
5659 const char *cmd = "sleep";
5760 const char *argv[] = { cmd, "1", NULL, };
5861 char *bname, *mmap_filename;
5962 u64 prev_time = 0;
6063 bool found_cmd_mmap = false,
64
+ found_coreutils_mmap = false,
6165 found_libc_mmap = false,
6266 found_vdso_mmap = false,
6367 found_ld_mmap = false;
....@@ -101,10 +105,10 @@
101105 /*
102106 * Config the evsels, setting attr->comm on the first one, etc.
103107 */
104
- evsel = perf_evlist__first(evlist);
105
- perf_evsel__set_sample_bit(evsel, CPU);
106
- perf_evsel__set_sample_bit(evsel, TID);
107
- perf_evsel__set_sample_bit(evsel, TIME);
108
+ evsel = evlist__first(evlist);
109
+ evsel__set_sample_bit(evsel, CPU);
110
+ evsel__set_sample_bit(evsel, TID);
111
+ evsel__set_sample_bit(evsel, TIME);
108112 perf_evlist__config(evlist, &opts, NULL);
109113
110114 err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask);
....@@ -129,7 +133,7 @@
129133 * Call sys_perf_event_open on all the fds on all the evsels,
130134 * grouping them if asked to.
131135 */
132
- err = perf_evlist__open(evlist);
136
+ err = evlist__open(evlist);
133137 if (err < 0) {
134138 pr_debug("perf_evlist__open: %s\n",
135139 str_error_r(errno, sbuf, sizeof(sbuf)));
....@@ -141,9 +145,9 @@
141145 * fds in the same CPU to be injected in the same mmap ring buffer
142146 * (using ioctl(PERF_EVENT_IOC_SET_OUTPUT)).
143147 */
144
- err = perf_evlist__mmap(evlist, opts.mmap_pages);
148
+ err = evlist__mmap(evlist, opts.mmap_pages);
145149 if (err < 0) {
146
- pr_debug("perf_evlist__mmap: %s\n",
150
+ pr_debug("evlist__mmap: %s\n",
147151 str_error_r(errno, sbuf, sizeof(sbuf)));
148152 goto out_delete_evlist;
149153 }
....@@ -152,7 +156,7 @@
152156 * Now that all is properly set up, enable the events, they will
153157 * count just on workload.pid, which will start...
154158 */
155
- perf_evlist__enable(evlist);
159
+ evlist__enable(evlist);
156160
157161 /*
158162 * Now!
....@@ -162,15 +166,15 @@
162166 while (1) {
163167 int before = total_events;
164168
165
- for (i = 0; i < evlist->nr_mmaps; i++) {
169
+ for (i = 0; i < evlist->core.nr_mmaps; i++) {
166170 union perf_event *event;
167
- struct perf_mmap *md;
171
+ struct mmap *md;
168172
169173 md = &evlist->mmap[i];
170
- if (perf_mmap__read_init(md) < 0)
174
+ if (perf_mmap__read_init(&md->core) < 0)
171175 continue;
172176
173
- while ((event = perf_mmap__read_event(md)) != NULL) {
177
+ while ((event = perf_mmap__read_event(&md->core)) != NULL) {
174178 const u32 type = event->header.type;
175179 const char *name = perf_event__name(type);
176180
....@@ -181,14 +185,14 @@
181185 err = perf_evlist__parse_sample(evlist, event, &sample);
182186 if (err < 0) {
183187 if (verbose > 0)
184
- perf_event__fprintf(event, stderr);
188
+ perf_event__fprintf(event, NULL, stderr);
185189 pr_debug("Couldn't parse sample\n");
186190 goto out_delete_evlist;
187191 }
188192
189193 if (verbose > 0) {
190194 pr_info("%" PRIu64" %d ", sample.time, sample.cpu);
191
- perf_event__fprintf(event, stderr);
195
+ perf_event__fprintf(event, NULL, stderr);
192196 }
193197
194198 if (prev_time > sample.time) {
....@@ -254,6 +258,8 @@
254258 if (bname != NULL) {
255259 if (!found_cmd_mmap)
256260 found_cmd_mmap = !strcmp(bname + 1, cmd);
261
+ if (!found_coreutils_mmap)
262
+ found_coreutils_mmap = !strcmp(bname + 1, "coreutils");
257263 if (!found_libc_mmap)
258264 found_libc_mmap = !strncmp(bname + 1, "libc", 4);
259265 if (!found_ld_mmap)
....@@ -271,9 +277,9 @@
271277 ++errs;
272278 }
273279
274
- perf_mmap__consume(md);
280
+ perf_mmap__consume(&md->core);
275281 }
276
- perf_mmap__read_done(md);
282
+ perf_mmap__read_done(&md->core);
277283 }
278284
279285 /*
....@@ -282,7 +288,7 @@
282288 * perf_event_attr.wakeup_events, just PERF_EVENT_SAMPLE does.
283289 */
284290 if (total_events == before && false)
285
- perf_evlist__poll(evlist, -1);
291
+ evlist__poll(evlist, -1);
286292
287293 sleep(1);
288294 if (++wakeups > 5) {
....@@ -292,7 +298,7 @@
292298 }
293299
294300 found_exit:
295
- if (nr_events[PERF_RECORD_COMM] > 1) {
301
+ if (nr_events[PERF_RECORD_COMM] > 1 + !!found_coreutils_mmap) {
296302 pr_debug("Excessive number of PERF_RECORD_COMM events!\n");
297303 ++errs;
298304 }
....@@ -302,7 +308,7 @@
302308 ++errs;
303309 }
304310
305
- if (!found_cmd_mmap) {
311
+ if (!found_cmd_mmap && !found_coreutils_mmap) {
306312 pr_debug("PERF_RECORD_MMAP for %s missing!\n", cmd);
307313 ++errs;
308314 }
....@@ -322,7 +328,7 @@
322328 ++errs;
323329 }
324330 out_delete_evlist:
325
- perf_evlist__delete(evlist);
331
+ evlist__delete(evlist);
326332 out:
327333 return (err < 0 || errs > 0) ? -1 : 0;
328334 }