hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/tools/perf/tests/switch-tracking.c
....@@ -2,15 +2,22 @@
22 #include <sys/time.h>
33 #include <sys/prctl.h>
44 #include <errno.h>
5
+#include <limits.h>
56 #include <time.h>
67 #include <stdlib.h>
8
+#include <linux/zalloc.h>
9
+#include <perf/cpumap.h>
10
+#include <perf/evlist.h>
11
+#include <perf/mmap.h>
712
13
+#include "debug.h"
814 #include "parse-events.h"
915 #include "evlist.h"
1016 #include "evsel.h"
1117 #include "thread_map.h"
12
-#include "cpumap.h"
18
+#include "record.h"
1319 #include "tests.h"
20
+#include "util/mmap.h"
1421
1522 static int spin_sleep(void)
1623 {
....@@ -51,8 +58,8 @@
5158 }
5259
5360 struct switch_tracking {
54
- struct perf_evsel *switch_evsel;
55
- struct perf_evsel *cycles_evsel;
61
+ struct evsel *switch_evsel;
62
+ struct evsel *cycles_evsel;
5663 pid_t *tids;
5764 int nr_tids;
5865 int comm_seen[4];
....@@ -112,12 +119,12 @@
112119 return 0;
113120 }
114121
115
-static int process_sample_event(struct perf_evlist *evlist,
122
+static int process_sample_event(struct evlist *evlist,
116123 union perf_event *event,
117124 struct switch_tracking *switch_tracking)
118125 {
119126 struct perf_sample sample;
120
- struct perf_evsel *evsel;
127
+ struct evsel *evsel;
121128 pid_t next_tid, prev_tid;
122129 int cpu, err;
123130
....@@ -128,8 +135,8 @@
128135
129136 evsel = perf_evlist__id2evsel(evlist, sample.id);
130137 if (evsel == switch_tracking->switch_evsel) {
131
- next_tid = perf_evsel__intval(evsel, &sample, "next_pid");
132
- prev_tid = perf_evsel__intval(evsel, &sample, "prev_pid");
138
+ next_tid = evsel__intval(evsel, &sample, "next_pid");
139
+ prev_tid = evsel__intval(evsel, &sample, "prev_pid");
133140 cpu = sample.cpu;
134141 pr_debug3("sched_switch: cpu: %d prev_tid %d next_tid %d\n",
135142 cpu, prev_tid, next_tid);
....@@ -138,7 +145,7 @@
138145 return err;
139146 /*
140147 * Check for no missing sched_switch events i.e. that the
141
- * evsel->system_wide flag has worked.
148
+ * evsel->core.system_wide flag has worked.
142149 */
143150 if (switch_tracking->tids[cpu] != -1 &&
144151 switch_tracking->tids[cpu] != prev_tid) {
....@@ -162,7 +169,7 @@
162169 return 0;
163170 }
164171
165
-static int process_event(struct perf_evlist *evlist, union perf_event *event,
172
+static int process_event(struct evlist *evlist, union perf_event *event,
166173 struct switch_tracking *switch_tracking)
167174 {
168175 if (event->header.type == PERF_RECORD_SAMPLE)
....@@ -202,7 +209,7 @@
202209 u64 event_time;
203210 };
204211
205
-static int add_event(struct perf_evlist *evlist, struct list_head *events,
212
+static int add_event(struct evlist *evlist, struct list_head *events,
206213 union perf_event *event)
207214 {
208215 struct perf_sample sample;
....@@ -237,7 +244,7 @@
237244
238245 while (!list_empty(events)) {
239246 node = list_entry(events->next, struct event_node, list);
240
- list_del(&node->list);
247
+ list_del_init(&node->list);
241248 free(node);
242249 }
243250 }
....@@ -251,29 +258,29 @@
251258 return cmp;
252259 }
253260
254
-static int process_events(struct perf_evlist *evlist,
261
+static int process_events(struct evlist *evlist,
255262 struct switch_tracking *switch_tracking)
256263 {
257264 union perf_event *event;
258265 unsigned pos, cnt = 0;
259266 LIST_HEAD(events);
260267 struct event_node *events_array, *node;
261
- struct perf_mmap *md;
268
+ struct mmap *md;
262269 int i, ret;
263270
264
- for (i = 0; i < evlist->nr_mmaps; i++) {
271
+ for (i = 0; i < evlist->core.nr_mmaps; i++) {
265272 md = &evlist->mmap[i];
266
- if (perf_mmap__read_init(md) < 0)
273
+ if (perf_mmap__read_init(&md->core) < 0)
267274 continue;
268275
269
- while ((event = perf_mmap__read_event(md)) != NULL) {
276
+ while ((event = perf_mmap__read_event(&md->core)) != NULL) {
270277 cnt += 1;
271278 ret = add_event(evlist, &events, event);
272
- perf_mmap__consume(md);
279
+ perf_mmap__consume(&md->core);
273280 if (ret < 0)
274281 goto out_free_nodes;
275282 }
276
- perf_mmap__read_done(md);
283
+ perf_mmap__read_done(&md->core);
277284 }
278285
279286 events_array = calloc(cnt, sizeof(struct event_node));
....@@ -310,7 +317,7 @@
310317 *
311318 * This function implements a test that checks that sched_switch events and
312319 * tracking events can be recorded for a workload (current process) using the
313
- * evsel->system_wide and evsel->tracking flags (respectively) with other events
320
+ * evsel->core.system_wide and evsel->tracking flags (respectively) with other events
314321 * sometimes enabled or disabled.
315322 */
316323 int test__switch_tracking(struct test *test __maybe_unused, int subtest __maybe_unused)
....@@ -326,11 +333,11 @@
326333 .uses_mmap = true,
327334 },
328335 };
329
- struct thread_map *threads = NULL;
330
- struct cpu_map *cpus = NULL;
331
- struct perf_evlist *evlist = NULL;
332
- struct perf_evsel *evsel, *cpu_clocks_evsel, *cycles_evsel;
333
- struct perf_evsel *switch_evsel, *tracking_evsel;
336
+ struct perf_thread_map *threads = NULL;
337
+ struct perf_cpu_map *cpus = NULL;
338
+ struct evlist *evlist = NULL;
339
+ struct evsel *evsel, *cpu_clocks_evsel, *cycles_evsel;
340
+ struct evsel *switch_evsel, *tracking_evsel;
334341 const char *comm;
335342 int err = -1;
336343
....@@ -340,19 +347,19 @@
340347 goto out_err;
341348 }
342349
343
- cpus = cpu_map__new(NULL);
350
+ cpus = perf_cpu_map__new(NULL);
344351 if (!cpus) {
345
- pr_debug("cpu_map__new failed!\n");
352
+ pr_debug("perf_cpu_map__new failed!\n");
346353 goto out_err;
347354 }
348355
349
- evlist = perf_evlist__new();
356
+ evlist = evlist__new();
350357 if (!evlist) {
351
- pr_debug("perf_evlist__new failed!\n");
358
+ pr_debug("evlist__new failed!\n");
352359 goto out_err;
353360 }
354361
355
- perf_evlist__set_maps(evlist, cpus, threads);
362
+ perf_evlist__set_maps(&evlist->core, cpus, threads);
356363
357364 /* First event */
358365 err = parse_events(evlist, "cpu-clock:u", NULL);
....@@ -361,7 +368,7 @@
361368 goto out_err;
362369 }
363370
364
- cpu_clocks_evsel = perf_evlist__last(evlist);
371
+ cpu_clocks_evsel = evlist__last(evlist);
365372
366373 /* Second event */
367374 err = parse_events(evlist, "cycles:u", NULL);
....@@ -370,7 +377,7 @@
370377 goto out_err;
371378 }
372379
373
- cycles_evsel = perf_evlist__last(evlist);
380
+ cycles_evsel = evlist__last(evlist);
374381
375382 /* Third event */
376383 if (!perf_evlist__can_select_event(evlist, sched_switch)) {
....@@ -385,28 +392,28 @@
385392 goto out_err;
386393 }
387394
388
- switch_evsel = perf_evlist__last(evlist);
395
+ switch_evsel = evlist__last(evlist);
389396
390
- perf_evsel__set_sample_bit(switch_evsel, CPU);
391
- perf_evsel__set_sample_bit(switch_evsel, TIME);
397
+ evsel__set_sample_bit(switch_evsel, CPU);
398
+ evsel__set_sample_bit(switch_evsel, TIME);
392399
393
- switch_evsel->system_wide = true;
400
+ switch_evsel->core.system_wide = true;
394401 switch_evsel->no_aux_samples = true;
395402 switch_evsel->immediate = true;
396403
397404 /* Test moving an event to the front */
398
- if (cycles_evsel == perf_evlist__first(evlist)) {
405
+ if (cycles_evsel == evlist__first(evlist)) {
399406 pr_debug("cycles event already at front");
400407 goto out_err;
401408 }
402409 perf_evlist__to_front(evlist, cycles_evsel);
403
- if (cycles_evsel != perf_evlist__first(evlist)) {
410
+ if (cycles_evsel != evlist__first(evlist)) {
404411 pr_debug("Failed to move cycles event to front");
405412 goto out_err;
406413 }
407414
408
- perf_evsel__set_sample_bit(cycles_evsel, CPU);
409
- perf_evsel__set_sample_bit(cycles_evsel, TIME);
415
+ evsel__set_sample_bit(cycles_evsel, CPU);
416
+ evsel__set_sample_bit(cycles_evsel, TIME);
410417
411418 /* Fourth event */
412419 err = parse_events(evlist, "dummy:u", NULL);
....@@ -415,26 +422,26 @@
415422 goto out_err;
416423 }
417424
418
- tracking_evsel = perf_evlist__last(evlist);
425
+ tracking_evsel = evlist__last(evlist);
419426
420427 perf_evlist__set_tracking_event(evlist, tracking_evsel);
421428
422
- tracking_evsel->attr.freq = 0;
423
- tracking_evsel->attr.sample_period = 1;
429
+ tracking_evsel->core.attr.freq = 0;
430
+ tracking_evsel->core.attr.sample_period = 1;
424431
425
- perf_evsel__set_sample_bit(tracking_evsel, TIME);
432
+ evsel__set_sample_bit(tracking_evsel, TIME);
426433
427434 /* Config events */
428435 perf_evlist__config(evlist, &opts, NULL);
429436
430437 /* Check moved event is still at the front */
431
- if (cycles_evsel != perf_evlist__first(evlist)) {
438
+ if (cycles_evsel != evlist__first(evlist)) {
432439 pr_debug("Front event no longer at front");
433440 goto out_err;
434441 }
435442
436443 /* Check tracking event is tracking */
437
- if (!tracking_evsel->attr.mmap || !tracking_evsel->attr.comm) {
444
+ if (!tracking_evsel->core.attr.mmap || !tracking_evsel->core.attr.comm) {
438445 pr_debug("Tracking event not tracking\n");
439446 goto out_err;
440447 }
....@@ -442,28 +449,28 @@
442449 /* Check non-tracking events are not tracking */
443450 evlist__for_each_entry(evlist, evsel) {
444451 if (evsel != tracking_evsel) {
445
- if (evsel->attr.mmap || evsel->attr.comm) {
452
+ if (evsel->core.attr.mmap || evsel->core.attr.comm) {
446453 pr_debug("Non-tracking event is tracking\n");
447454 goto out_err;
448455 }
449456 }
450457 }
451458
452
- if (perf_evlist__open(evlist) < 0) {
459
+ if (evlist__open(evlist) < 0) {
453460 pr_debug("Not supported\n");
454461 err = 0;
455462 goto out;
456463 }
457464
458
- err = perf_evlist__mmap(evlist, UINT_MAX);
465
+ err = evlist__mmap(evlist, UINT_MAX);
459466 if (err) {
460
- pr_debug("perf_evlist__mmap failed!\n");
467
+ pr_debug("evlist__mmap failed!\n");
461468 goto out_err;
462469 }
463470
464
- perf_evlist__enable(evlist);
471
+ evlist__enable(evlist);
465472
466
- err = perf_evsel__disable(cpu_clocks_evsel);
473
+ err = evsel__disable(cpu_clocks_evsel);
467474 if (err) {
468475 pr_debug("perf_evlist__disable_event failed!\n");
469476 goto out_err;
....@@ -482,7 +489,7 @@
482489 goto out_err;
483490 }
484491
485
- err = perf_evsel__disable(cycles_evsel);
492
+ err = evsel__disable(cycles_evsel);
486493 if (err) {
487494 pr_debug("perf_evlist__disable_event failed!\n");
488495 goto out_err;
....@@ -508,7 +515,7 @@
508515 goto out_err;
509516 }
510517
511
- err = perf_evsel__enable(cycles_evsel);
518
+ err = evsel__enable(cycles_evsel);
512519 if (err) {
513520 pr_debug("perf_evlist__disable_event failed!\n");
514521 goto out_err;
....@@ -527,7 +534,7 @@
527534 goto out_err;
528535 }
529536
530
- perf_evlist__disable(evlist);
537
+ evlist__disable(evlist);
531538
532539 switch_tracking.switch_evsel = switch_evsel;
533540 switch_tracking.cycles_evsel = cycles_evsel;
....@@ -565,11 +572,11 @@
565572 }
566573 out:
567574 if (evlist) {
568
- perf_evlist__disable(evlist);
569
- perf_evlist__delete(evlist);
575
+ evlist__disable(evlist);
576
+ evlist__delete(evlist);
570577 } else {
571
- cpu_map__put(cpus);
572
- thread_map__put(threads);
578
+ perf_cpu_map__put(cpus);
579
+ perf_thread_map__put(threads);
573580 }
574581
575582 return err;