1 // SPDX-License-Identifier: GPL-2.0
2 #include "parse-events.h"
13 #include <sys/types.h>
16 #include <linux/kernel.h>
17 #include <linux/hw_breakpoint.h>
18 #include <api/fs/tracing_path.h>
20 #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
21 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
23 static int num_core_entries(void)
26 * If the kernel supports extended type, expect events to be
27 * opened once for each core PMU type. Otherwise fall back to the legacy
28 * behavior of opening only one event even though there are multiple
31 if (perf_pmus__supports_extended_type())
32 return perf_pmus__num_core_pmus();
37 static bool test_config(const struct evsel
*evsel
, __u64 expected_config
)
39 __u32 type
= evsel
->core
.attr
.type
;
40 __u64 config
= evsel
->core
.attr
.config
;
42 if (type
== PERF_TYPE_HARDWARE
|| type
== PERF_TYPE_HW_CACHE
) {
44 * HARDWARE and HW_CACHE events encode the PMU's extended type
45 * in the top 32-bits. Mask in order to ignore.
47 config
&= PERF_HW_EVENT_MASK
;
49 return config
== expected_config
;
52 static bool test_perf_config(const struct perf_evsel
*evsel
, __u64 expected_config
)
54 return (evsel
->attr
.config
& PERF_HW_EVENT_MASK
) == expected_config
;
57 #ifdef HAVE_LIBTRACEEVENT
59 #if defined(__s390x__)
60 /* Return true if kvm module is available and loaded. Test this
61 * and return success when trace point kvm_s390_create_vm
62 * exists. Otherwise this test always fails.
64 static bool kvm_s390_create_vm_valid(void)
69 eventfile
= get_events_file("kvm-s390");
72 DIR *mydir
= opendir(eventfile
);
78 put_events_file(eventfile
);
85 static int test__checkevent_tracepoint(struct evlist
*evlist
)
87 struct evsel
*evsel
= evlist__first(evlist
);
89 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
90 TEST_ASSERT_VAL("wrong number of groups", 0 == evlist__nr_groups(evlist
));
91 TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT
== evsel
->core
.attr
.type
);
92 TEST_ASSERT_VAL("wrong sample_type",
93 PERF_TP_SAMPLE_TYPE
== evsel
->core
.attr
.sample_type
);
94 TEST_ASSERT_VAL("wrong sample_period", 1 == evsel
->core
.attr
.sample_period
);
98 static int test__checkevent_tracepoint_multi(struct evlist
*evlist
)
102 TEST_ASSERT_VAL("wrong number of entries", evlist
->core
.nr_entries
> 1);
103 TEST_ASSERT_VAL("wrong number of groups", 0 == evlist__nr_groups(evlist
));
105 evlist__for_each_entry(evlist
, evsel
) {
106 TEST_ASSERT_VAL("wrong type",
107 PERF_TYPE_TRACEPOINT
== evsel
->core
.attr
.type
);
108 TEST_ASSERT_VAL("wrong sample_type",
109 PERF_TP_SAMPLE_TYPE
== evsel
->core
.attr
.sample_type
);
110 TEST_ASSERT_VAL("wrong sample_period",
111 1 == evsel
->core
.attr
.sample_period
);
115 #endif /* HAVE_LIBTRACEEVENT */
117 static int test__checkevent_raw(struct evlist
*evlist
)
119 struct perf_evsel
*evsel
;
120 bool raw_type_match
= false;
122 TEST_ASSERT_VAL("wrong number of entries", 0 != evlist
->core
.nr_entries
);
124 perf_evlist__for_each_evsel(&evlist
->core
, evsel
) {
125 struct perf_pmu
*pmu __maybe_unused
= NULL
;
126 bool type_matched
= false;
128 TEST_ASSERT_VAL("wrong config", test_perf_config(evsel
, 0x1a));
129 TEST_ASSERT_VAL("event not parsed as raw type",
130 evsel
->attr
.type
== PERF_TYPE_RAW
);
131 #if defined(__aarch64__)
133 * Arm doesn't have a real raw type PMU in sysfs, so raw events
134 * would never match any PMU. However, RAW events on Arm will
135 * always successfully open on the first available core PMU
136 * so no need to test for a matching type here.
138 type_matched
= raw_type_match
= true;
140 while ((pmu
= perf_pmus__scan(pmu
)) != NULL
) {
141 if (pmu
->type
== evsel
->attr
.type
) {
142 TEST_ASSERT_VAL("PMU type expected once", !type_matched
);
144 if (pmu
->type
== PERF_TYPE_RAW
)
145 raw_type_match
= true;
149 TEST_ASSERT_VAL("No PMU found for type", type_matched
);
151 TEST_ASSERT_VAL("Raw PMU not matched", raw_type_match
);
155 static int test__checkevent_numeric(struct evlist
*evlist
)
157 struct evsel
*evsel
= evlist__first(evlist
);
159 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
160 TEST_ASSERT_VAL("wrong type", 1 == evsel
->core
.attr
.type
);
161 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 1));
166 static int assert_hw(struct perf_evsel
*evsel
, enum perf_hw_id id
, const char *name
)
168 struct perf_pmu
*pmu
;
170 if (evsel
->attr
.type
== PERF_TYPE_HARDWARE
) {
171 TEST_ASSERT_VAL("wrong config", test_perf_config(evsel
, id
));
174 pmu
= perf_pmus__find_by_type(evsel
->attr
.type
);
176 TEST_ASSERT_VAL("unexpected PMU type", pmu
);
177 TEST_ASSERT_VAL("PMU missing event", perf_pmu__have_event(pmu
, name
));
181 static int test__checkevent_symbolic_name(struct evlist
*evlist
)
183 struct perf_evsel
*evsel
;
185 TEST_ASSERT_VAL("wrong number of entries", 0 != evlist
->core
.nr_entries
);
187 perf_evlist__for_each_evsel(&evlist
->core
, evsel
) {
188 int ret
= assert_hw(evsel
, PERF_COUNT_HW_INSTRUCTIONS
, "instructions");
197 static int test__checkevent_symbolic_name_config(struct evlist
*evlist
)
199 struct perf_evsel
*evsel
;
201 TEST_ASSERT_VAL("wrong number of entries", 0 != evlist
->core
.nr_entries
);
203 perf_evlist__for_each_evsel(&evlist
->core
, evsel
) {
204 int ret
= assert_hw(evsel
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
209 * The period value gets configured within evlist__config,
210 * while this test executes only parse events method.
212 TEST_ASSERT_VAL("wrong period", 0 == evsel
->attr
.sample_period
);
213 TEST_ASSERT_VAL("wrong config1", 0 == evsel
->attr
.config1
);
214 TEST_ASSERT_VAL("wrong config2", 1 == evsel
->attr
.config2
);
219 static int test__checkevent_symbolic_alias(struct evlist
*evlist
)
221 struct evsel
*evsel
= evlist__first(evlist
);
223 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
224 TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE
== evsel
->core
.attr
.type
);
225 TEST_ASSERT_VAL("wrong config", test_config(evsel
, PERF_COUNT_SW_PAGE_FAULTS
));
229 static int test__checkevent_genhw(struct evlist
*evlist
)
231 struct perf_evsel
*evsel
;
233 TEST_ASSERT_VAL("wrong number of entries", 0 != evlist
->core
.nr_entries
);
235 perf_evlist__for_each_entry(&evlist
->core
, evsel
) {
236 TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE
== evsel
->attr
.type
);
237 TEST_ASSERT_VAL("wrong config", test_perf_config(evsel
, 1 << 16));
242 static int test__checkevent_breakpoint(struct evlist
*evlist
)
244 struct evsel
*evsel
= evlist__first(evlist
);
246 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
247 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT
== evsel
->core
.attr
.type
);
248 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 0));
249 TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R
| HW_BREAKPOINT_W
) ==
250 evsel
->core
.attr
.bp_type
);
251 TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4
==
252 evsel
->core
.attr
.bp_len
);
256 static int test__checkevent_breakpoint_x(struct evlist
*evlist
)
258 struct evsel
*evsel
= evlist__first(evlist
);
260 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
261 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT
== evsel
->core
.attr
.type
);
262 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 0));
263 TEST_ASSERT_VAL("wrong bp_type",
264 HW_BREAKPOINT_X
== evsel
->core
.attr
.bp_type
);
265 TEST_ASSERT_VAL("wrong bp_len", default_breakpoint_len() == evsel
->core
.attr
.bp_len
);
269 static int test__checkevent_breakpoint_r(struct evlist
*evlist
)
271 struct evsel
*evsel
= evlist__first(evlist
);
273 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
274 TEST_ASSERT_VAL("wrong type",
275 PERF_TYPE_BREAKPOINT
== evsel
->core
.attr
.type
);
276 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 0));
277 TEST_ASSERT_VAL("wrong bp_type",
278 HW_BREAKPOINT_R
== evsel
->core
.attr
.bp_type
);
279 TEST_ASSERT_VAL("wrong bp_len",
280 HW_BREAKPOINT_LEN_4
== evsel
->core
.attr
.bp_len
);
284 static int test__checkevent_breakpoint_w(struct evlist
*evlist
)
286 struct evsel
*evsel
= evlist__first(evlist
);
288 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
289 TEST_ASSERT_VAL("wrong type",
290 PERF_TYPE_BREAKPOINT
== evsel
->core
.attr
.type
);
291 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 0));
292 TEST_ASSERT_VAL("wrong bp_type",
293 HW_BREAKPOINT_W
== evsel
->core
.attr
.bp_type
);
294 TEST_ASSERT_VAL("wrong bp_len",
295 HW_BREAKPOINT_LEN_4
== evsel
->core
.attr
.bp_len
);
299 static int test__checkevent_breakpoint_rw(struct evlist
*evlist
)
301 struct evsel
*evsel
= evlist__first(evlist
);
303 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
304 TEST_ASSERT_VAL("wrong type",
305 PERF_TYPE_BREAKPOINT
== evsel
->core
.attr
.type
);
306 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 0));
307 TEST_ASSERT_VAL("wrong bp_type",
308 (HW_BREAKPOINT_R
|HW_BREAKPOINT_W
) == evsel
->core
.attr
.bp_type
);
309 TEST_ASSERT_VAL("wrong bp_len",
310 HW_BREAKPOINT_LEN_4
== evsel
->core
.attr
.bp_len
);
314 #ifdef HAVE_LIBTRACEEVENT
315 static int test__checkevent_tracepoint_modifier(struct evlist
*evlist
)
317 struct evsel
*evsel
= evlist__first(evlist
);
319 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
320 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
321 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
322 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
324 return test__checkevent_tracepoint(evlist
);
328 test__checkevent_tracepoint_multi_modifier(struct evlist
*evlist
)
330 struct perf_evsel
*evsel
;
332 TEST_ASSERT_VAL("wrong number of entries", evlist
->core
.nr_entries
> 1);
334 perf_evlist__for_each_entry(&evlist
->core
, evsel
) {
335 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->attr
.exclude_user
);
336 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->attr
.exclude_kernel
);
337 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->attr
.exclude_hv
);
338 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->attr
.precise_ip
);
341 return test__checkevent_tracepoint_multi(evlist
);
343 #endif /* HAVE_LIBTRACEEVENT */
345 static int test__checkevent_raw_modifier(struct evlist
*evlist
)
347 struct perf_evsel
*evsel
;
349 perf_evlist__for_each_entry(&evlist
->core
, evsel
) {
350 TEST_ASSERT_VAL("wrong exclude_user", evsel
->attr
.exclude_user
);
351 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->attr
.exclude_kernel
);
352 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->attr
.exclude_hv
);
353 TEST_ASSERT_VAL("wrong precise_ip", evsel
->attr
.precise_ip
);
355 return test__checkevent_raw(evlist
);
358 static int test__checkevent_numeric_modifier(struct evlist
*evlist
)
360 struct perf_evsel
*evsel
;
362 perf_evlist__for_each_entry(&evlist
->core
, evsel
) {
363 TEST_ASSERT_VAL("wrong exclude_user", evsel
->attr
.exclude_user
);
364 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->attr
.exclude_kernel
);
365 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->attr
.exclude_hv
);
366 TEST_ASSERT_VAL("wrong precise_ip", evsel
->attr
.precise_ip
);
368 return test__checkevent_numeric(evlist
);
371 static int test__checkevent_symbolic_name_modifier(struct evlist
*evlist
)
373 struct perf_evsel
*evsel
;
375 TEST_ASSERT_VAL("wrong number of entries",
376 evlist
->core
.nr_entries
== num_core_entries());
378 perf_evlist__for_each_entry(&evlist
->core
, evsel
) {
379 TEST_ASSERT_VAL("wrong exclude_user", evsel
->attr
.exclude_user
);
380 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->attr
.exclude_kernel
);
381 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->attr
.exclude_hv
);
382 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->attr
.precise_ip
);
384 return test__checkevent_symbolic_name(evlist
);
387 static int test__checkevent_exclude_host_modifier(struct evlist
*evlist
)
389 struct perf_evsel
*evsel
;
391 perf_evlist__for_each_entry(&evlist
->core
, evsel
) {
392 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->attr
.exclude_guest
);
393 TEST_ASSERT_VAL("wrong exclude host", evsel
->attr
.exclude_host
);
395 return test__checkevent_symbolic_name(evlist
);
398 static int test__checkevent_exclude_guest_modifier(struct evlist
*evlist
)
400 struct perf_evsel
*evsel
;
402 perf_evlist__for_each_entry(&evlist
->core
, evsel
) {
403 TEST_ASSERT_VAL("wrong exclude guest", evsel
->attr
.exclude_guest
);
404 TEST_ASSERT_VAL("wrong exclude host", !evsel
->attr
.exclude_host
);
406 return test__checkevent_symbolic_name(evlist
);
409 static int test__checkevent_symbolic_alias_modifier(struct evlist
*evlist
)
411 struct evsel
*evsel
= evlist__first(evlist
);
413 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
414 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
415 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
416 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
418 return test__checkevent_symbolic_alias(evlist
);
421 static int test__checkevent_genhw_modifier(struct evlist
*evlist
)
423 struct perf_evsel
*evsel
;
425 perf_evlist__for_each_entry(&evlist
->core
, evsel
) {
426 TEST_ASSERT_VAL("wrong exclude_user", evsel
->attr
.exclude_user
);
427 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->attr
.exclude_kernel
);
428 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->attr
.exclude_hv
);
429 TEST_ASSERT_VAL("wrong precise_ip", evsel
->attr
.precise_ip
);
431 return test__checkevent_genhw(evlist
);
434 static int test__checkevent_exclude_idle_modifier(struct evlist
*evlist
)
436 struct evsel
*evsel
= evlist__first(evlist
);
438 TEST_ASSERT_VAL("wrong exclude idle", evsel
->core
.attr
.exclude_idle
);
439 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
440 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
441 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
442 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
443 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
444 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
446 return test__checkevent_symbolic_name(evlist
);
449 static int test__checkevent_exclude_idle_modifier_1(struct evlist
*evlist
)
451 struct evsel
*evsel
= evlist__first(evlist
);
453 TEST_ASSERT_VAL("wrong exclude idle", evsel
->core
.attr
.exclude_idle
);
454 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
455 TEST_ASSERT_VAL("wrong exclude host", evsel
->core
.attr
.exclude_host
);
456 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
457 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
458 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
459 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
461 return test__checkevent_symbolic_name(evlist
);
464 static int test__checkevent_breakpoint_modifier(struct evlist
*evlist
)
466 struct evsel
*evsel
= evlist__first(evlist
);
469 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
470 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
471 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
472 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
473 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "mem:0:u"));
475 return test__checkevent_breakpoint(evlist
);
478 static int test__checkevent_breakpoint_x_modifier(struct evlist
*evlist
)
480 struct evsel
*evsel
= evlist__first(evlist
);
482 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
483 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
484 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
485 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
486 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "mem:0:x:k"));
488 return test__checkevent_breakpoint_x(evlist
);
491 static int test__checkevent_breakpoint_r_modifier(struct evlist
*evlist
)
493 struct evsel
*evsel
= evlist__first(evlist
);
495 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
496 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
497 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
498 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
);
499 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "mem:0:r:hp"));
501 return test__checkevent_breakpoint_r(evlist
);
504 static int test__checkevent_breakpoint_w_modifier(struct evlist
*evlist
)
506 struct evsel
*evsel
= evlist__first(evlist
);
508 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
509 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
510 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
511 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
);
512 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "mem:0:w:up"));
514 return test__checkevent_breakpoint_w(evlist
);
517 static int test__checkevent_breakpoint_rw_modifier(struct evlist
*evlist
)
519 struct evsel
*evsel
= evlist__first(evlist
);
521 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
522 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
523 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
524 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
);
525 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "mem:0:rw:kp"));
527 return test__checkevent_breakpoint_rw(evlist
);
530 static int test__checkevent_breakpoint_modifier_name(struct evlist
*evlist
)
532 struct evsel
*evsel
= evlist__first(evlist
);
534 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
535 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
536 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
537 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
538 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "breakpoint"));
540 return test__checkevent_breakpoint(evlist
);
543 static int test__checkevent_breakpoint_x_modifier_name(struct evlist
*evlist
)
545 struct evsel
*evsel
= evlist__first(evlist
);
547 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
548 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
549 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
550 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
551 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "breakpoint"));
553 return test__checkevent_breakpoint_x(evlist
);
556 static int test__checkevent_breakpoint_r_modifier_name(struct evlist
*evlist
)
558 struct evsel
*evsel
= evlist__first(evlist
);
560 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
561 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
562 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
563 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
);
564 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "breakpoint"));
566 return test__checkevent_breakpoint_r(evlist
);
569 static int test__checkevent_breakpoint_w_modifier_name(struct evlist
*evlist
)
571 struct evsel
*evsel
= evlist__first(evlist
);
573 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
574 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
575 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
576 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
);
577 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "breakpoint"));
579 return test__checkevent_breakpoint_w(evlist
);
582 static int test__checkevent_breakpoint_rw_modifier_name(struct evlist
*evlist
)
584 struct evsel
*evsel
= evlist__first(evlist
);
586 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
587 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
588 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
589 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
);
590 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "breakpoint"));
592 return test__checkevent_breakpoint_rw(evlist
);
595 static int test__checkevent_breakpoint_2_events(struct evlist
*evlist
)
597 struct evsel
*evsel
= evlist__first(evlist
);
599 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist
->core
.nr_entries
);
601 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT
== evsel
->core
.attr
.type
);
602 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "breakpoint1"));
604 evsel
= evsel__next(evsel
);
606 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT
== evsel
->core
.attr
.type
);
607 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "breakpoint2"));
612 static int test__checkevent_pmu(struct evlist
*evlist
)
615 struct evsel
*evsel
= evlist__first(evlist
);
617 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
618 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW
== evsel
->core
.attr
.type
);
619 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 10));
620 TEST_ASSERT_VAL("wrong config1", 1 == evsel
->core
.attr
.config1
);
621 TEST_ASSERT_VAL("wrong config2", 3 == evsel
->core
.attr
.config2
);
622 TEST_ASSERT_VAL("wrong config3", 0 == evsel
->core
.attr
.config3
);
624 * The period value gets configured within evlist__config,
625 * while this test executes only parse events method.
627 TEST_ASSERT_VAL("wrong period", 0 == evsel
->core
.attr
.sample_period
);
632 #ifdef HAVE_LIBTRACEEVENT
633 static int test__checkevent_list(struct evlist
*evlist
)
635 struct evsel
*evsel
= evlist__first(evlist
);
637 TEST_ASSERT_VAL("wrong number of entries", 3 <= evlist
->core
.nr_entries
);
640 TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT
!= evsel
->core
.attr
.type
);
641 while (evsel
->core
.attr
.type
!= PERF_TYPE_TRACEPOINT
) {
642 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 1));
643 TEST_ASSERT_VAL("wrong config1", 0 == evsel
->core
.attr
.config1
);
644 TEST_ASSERT_VAL("wrong config2", 0 == evsel
->core
.attr
.config2
);
645 TEST_ASSERT_VAL("wrong config3", 0 == evsel
->core
.attr
.config3
);
646 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
647 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
648 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
649 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
650 evsel
= evsel__next(evsel
);
653 /* syscalls:sys_enter_openat:k */
654 TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT
== evsel
->core
.attr
.type
);
655 TEST_ASSERT_VAL("wrong sample_type",
656 PERF_TP_SAMPLE_TYPE
== evsel
->core
.attr
.sample_type
);
657 TEST_ASSERT_VAL("wrong sample_period", 1 == evsel
->core
.attr
.sample_period
);
658 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
659 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
660 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
661 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
664 evsel
= evsel__next(evsel
);
665 TEST_ASSERT_VAL("wrong type", 1 == evsel
->core
.attr
.type
);
666 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 1));
667 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
668 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
669 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
670 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
);
676 static int test__checkevent_pmu_name(struct evlist
*evlist
)
678 struct evsel
*evsel
= evlist__first(evlist
);
680 /* cpu/config=1,name=krava/u */
681 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist
->core
.nr_entries
);
682 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW
== evsel
->core
.attr
.type
);
683 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 1));
684 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "krava"));
686 /* cpu/config=2/u" */
687 evsel
= evsel__next(evsel
);
688 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist
->core
.nr_entries
);
689 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW
== evsel
->core
.attr
.type
);
690 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 2));
691 TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel
, "cpu/config=2/u"));
696 static int test__checkevent_pmu_partial_time_callgraph(struct evlist
*evlist
)
698 struct evsel
*evsel
= evlist__first(evlist
);
700 /* cpu/config=1,call-graph=fp,time,period=100000/ */
701 TEST_ASSERT_VAL("wrong number of entries", 2 == evlist
->core
.nr_entries
);
702 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW
== evsel
->core
.attr
.type
);
703 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 1));
705 * The period, time and callgraph value gets configured within evlist__config,
706 * while this test executes only parse events method.
708 TEST_ASSERT_VAL("wrong period", 0 == evsel
->core
.attr
.sample_period
);
709 TEST_ASSERT_VAL("wrong callgraph", !evsel__has_callchain(evsel
));
710 TEST_ASSERT_VAL("wrong time", !(PERF_SAMPLE_TIME
& evsel
->core
.attr
.sample_type
));
712 /* cpu/config=2,call-graph=no,time=0,period=2000/ */
713 evsel
= evsel__next(evsel
);
714 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW
== evsel
->core
.attr
.type
);
715 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 2));
717 * The period, time and callgraph value gets configured within evlist__config,
718 * while this test executes only parse events method.
720 TEST_ASSERT_VAL("wrong period", 0 == evsel
->core
.attr
.sample_period
);
721 TEST_ASSERT_VAL("wrong callgraph", !evsel__has_callchain(evsel
));
722 TEST_ASSERT_VAL("wrong time", !(PERF_SAMPLE_TIME
& evsel
->core
.attr
.sample_type
));
727 static int test__checkevent_pmu_events(struct evlist
*evlist
)
729 struct evsel
*evsel
= evlist__first(evlist
);
731 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
732 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW
== evsel
->core
.attr
.type
||
733 strcmp(evsel
->pmu
->name
, "cpu"));
734 TEST_ASSERT_VAL("wrong exclude_user",
735 !evsel
->core
.attr
.exclude_user
);
736 TEST_ASSERT_VAL("wrong exclude_kernel",
737 evsel
->core
.attr
.exclude_kernel
);
738 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
739 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
740 TEST_ASSERT_VAL("wrong pinned", !evsel
->core
.attr
.pinned
);
741 TEST_ASSERT_VAL("wrong exclusive", !evsel
->core
.attr
.exclusive
);
747 static int test__checkevent_pmu_events_mix(struct evlist
*evlist
)
749 struct evsel
*evsel
= NULL
;
752 * The wild card event will be opened at least once, but it may be
753 * opened on each core PMU.
755 TEST_ASSERT_VAL("wrong number of entries", evlist
->core
.nr_entries
>= 2);
756 for (int i
= 0; i
< evlist
->core
.nr_entries
- 1; i
++) {
757 evsel
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
759 TEST_ASSERT_VAL("wrong exclude_user",
760 !evsel
->core
.attr
.exclude_user
);
761 TEST_ASSERT_VAL("wrong exclude_kernel",
762 evsel
->core
.attr
.exclude_kernel
);
763 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
764 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
765 TEST_ASSERT_VAL("wrong pinned", !evsel
->core
.attr
.pinned
);
766 TEST_ASSERT_VAL("wrong exclusive", !evsel
->core
.attr
.exclusive
);
769 evsel
= evsel__next(evsel
);
770 TEST_ASSERT_VAL("wrong type", evsel__find_pmu(evsel
)->is_core
);
771 TEST_ASSERT_VAL("wrong exclude_user",
772 !evsel
->core
.attr
.exclude_user
);
773 TEST_ASSERT_VAL("wrong exclude_kernel",
774 evsel
->core
.attr
.exclude_kernel
);
775 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
776 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
777 TEST_ASSERT_VAL("wrong pinned", !evsel
->core
.attr
.pinned
);
778 TEST_ASSERT_VAL("wrong exclusive", !evsel
->core
.attr
.pinned
);
783 static int test__checkterms_simple(struct parse_events_terms
*terms
)
785 struct parse_events_term
*term
;
788 term
= list_entry(terms
->terms
.next
, struct parse_events_term
, list
);
789 TEST_ASSERT_VAL("wrong type term",
790 term
->type_term
== PARSE_EVENTS__TERM_TYPE_CONFIG
);
791 TEST_ASSERT_VAL("wrong type val",
792 term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
);
793 TEST_ASSERT_VAL("wrong val", term
->val
.num
== 10);
794 TEST_ASSERT_VAL("wrong config", !strcmp(term
->config
, "config"));
797 term
= list_entry(term
->list
.next
, struct parse_events_term
, list
);
798 TEST_ASSERT_VAL("wrong type term",
799 term
->type_term
== PARSE_EVENTS__TERM_TYPE_CONFIG1
);
800 TEST_ASSERT_VAL("wrong type val",
801 term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
);
802 TEST_ASSERT_VAL("wrong val", term
->val
.num
== 1);
803 TEST_ASSERT_VAL("wrong config", !strcmp(term
->config
, "config1"));
806 term
= list_entry(term
->list
.next
, struct parse_events_term
, list
);
807 TEST_ASSERT_VAL("wrong type term",
808 term
->type_term
== PARSE_EVENTS__TERM_TYPE_CONFIG2
);
809 TEST_ASSERT_VAL("wrong type val",
810 term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
);
811 TEST_ASSERT_VAL("wrong val", term
->val
.num
== 3);
812 TEST_ASSERT_VAL("wrong config", !strcmp(term
->config
, "config2"));
815 term
= list_entry(term
->list
.next
, struct parse_events_term
, list
);
816 TEST_ASSERT_VAL("wrong type term",
817 term
->type_term
== PARSE_EVENTS__TERM_TYPE_CONFIG3
);
818 TEST_ASSERT_VAL("wrong type val",
819 term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
);
820 TEST_ASSERT_VAL("wrong val", term
->val
.num
== 4);
821 TEST_ASSERT_VAL("wrong config", !strcmp(term
->config
, "config3"));
824 term
= list_entry(term
->list
.next
, struct parse_events_term
, list
);
825 TEST_ASSERT_VAL("wrong type term",
826 term
->type_term
== PARSE_EVENTS__TERM_TYPE_USER
);
827 TEST_ASSERT_VAL("wrong type val",
828 term
->type_val
== PARSE_EVENTS__TERM_TYPE_NUM
);
829 TEST_ASSERT_VAL("wrong val", term
->val
.num
== 1);
830 TEST_ASSERT_VAL("wrong config", !strcmp(term
->config
, "umask"));
835 * The perf_pmu__test_parse_init injects 'read' term into
836 * perf_pmu_events_list, so 'read' is evaluated as read term
837 * and not as raw event with 'ead' hex value.
839 term
= list_entry(term
->list
.next
, struct parse_events_term
, list
);
840 TEST_ASSERT_VAL("wrong type term",
841 term
->type_term
== PARSE_EVENTS__TERM_TYPE_RAW
);
842 TEST_ASSERT_VAL("wrong type val",
843 term
->type_val
== PARSE_EVENTS__TERM_TYPE_STR
);
844 TEST_ASSERT_VAL("wrong val", !strcmp(term
->val
.str
, "read"));
845 TEST_ASSERT_VAL("wrong config", !strcmp(term
->config
, "raw"));
850 * To be still able to pass 'ead' value with 'r' syntax,
851 * we added support to parse 'r0xHEX' event.
853 term
= list_entry(term
->list
.next
, struct parse_events_term
, list
);
854 TEST_ASSERT_VAL("wrong type term",
855 term
->type_term
== PARSE_EVENTS__TERM_TYPE_RAW
);
856 TEST_ASSERT_VAL("wrong type val",
857 term
->type_val
== PARSE_EVENTS__TERM_TYPE_STR
);
858 TEST_ASSERT_VAL("wrong val", !strcmp(term
->val
.str
, "r0xead"));
859 TEST_ASSERT_VAL("wrong config", !strcmp(term
->config
, "raw"));
863 static int test__group1(struct evlist
*evlist
)
865 struct evsel
*evsel
, *leader
;
867 TEST_ASSERT_VAL("wrong number of entries",
868 evlist
->core
.nr_entries
== (num_core_entries() * 2));
869 TEST_ASSERT_VAL("wrong number of groups",
870 evlist__nr_groups(evlist
) == num_core_entries());
872 for (int i
= 0; i
< num_core_entries(); i
++) {
876 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
877 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_INSTRUCTIONS
, "instructions");
881 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
882 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
883 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
884 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
885 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
886 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
887 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
888 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
889 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
890 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
893 evsel
= evsel__next(evsel
);
894 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
898 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
899 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
900 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
901 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
902 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
903 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
== 2);
904 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
905 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
906 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
911 static int test__group2(struct evlist
*evlist
)
913 struct evsel
*evsel
, *leader
= NULL
;
915 TEST_ASSERT_VAL("wrong number of entries",
916 evlist
->core
.nr_entries
== (2 * num_core_entries() + 1));
918 * TODO: Currently the software event won't be grouped with the hardware
919 * event except for 1 PMU.
921 TEST_ASSERT_VAL("wrong number of groups", 1 == evlist__nr_groups(evlist
));
923 evlist__for_each_entry(evlist
, evsel
) {
926 if (evsel
->core
.attr
.type
== PERF_TYPE_SOFTWARE
) {
927 /* faults + :ku modifier */
929 TEST_ASSERT_VAL("wrong config",
930 test_config(evsel
, PERF_COUNT_SW_PAGE_FAULTS
));
931 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
932 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
933 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
934 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
935 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
936 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
937 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
938 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
939 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
940 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
943 if (evsel
->core
.attr
.type
== PERF_TYPE_HARDWARE
&&
944 test_config(evsel
, PERF_COUNT_HW_BRANCH_INSTRUCTIONS
)) {
945 /* branches + :u modifier */
946 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
947 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
948 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
949 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
950 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
951 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
952 if (evsel__has_leader(evsel
, leader
))
953 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
954 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
958 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
962 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
963 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
964 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
965 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
966 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
967 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
968 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
969 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
974 #ifdef HAVE_LIBTRACEEVENT
975 static int test__group3(struct evlist
*evlist __maybe_unused
)
977 struct evsel
*evsel
, *group1_leader
= NULL
, *group2_leader
= NULL
;
980 TEST_ASSERT_VAL("wrong number of entries",
981 evlist
->core
.nr_entries
== (3 * perf_pmus__num_core_pmus() + 2));
983 * Currently the software event won't be grouped with the hardware event
984 * except for 1 PMU. This means there are always just 2 groups
985 * regardless of the number of core PMUs.
987 TEST_ASSERT_VAL("wrong number of groups", 2 == evlist__nr_groups(evlist
));
989 evlist__for_each_entry(evlist
, evsel
) {
990 if (evsel
->core
.attr
.type
== PERF_TYPE_TRACEPOINT
) {
991 /* group1 syscalls:sys_enter_openat:H */
992 group1_leader
= evsel
;
993 TEST_ASSERT_VAL("wrong sample_type",
994 evsel
->core
.attr
.sample_type
== PERF_TP_SAMPLE_TYPE
);
995 TEST_ASSERT_VAL("wrong sample_period", 1 == evsel
->core
.attr
.sample_period
);
996 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
997 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
998 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
999 TEST_ASSERT_VAL("wrong exclude guest", evsel
->core
.attr
.exclude_guest
);
1000 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1001 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1002 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1003 TEST_ASSERT_VAL("wrong group name", !strcmp(evsel
->group_name
, "group1"));
1004 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
1005 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
1006 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1009 if (evsel
->core
.attr
.type
== PERF_TYPE_HARDWARE
&&
1010 test_config(evsel
, PERF_COUNT_HW_CPU_CYCLES
)) {
1011 if (evsel
->core
.attr
.exclude_user
) {
1012 /* group1 cycles:kppp */
1013 TEST_ASSERT_VAL("wrong exclude_user",
1014 evsel
->core
.attr
.exclude_user
);
1015 TEST_ASSERT_VAL("wrong exclude_kernel",
1016 !evsel
->core
.attr
.exclude_kernel
);
1017 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1018 TEST_ASSERT_VAL("wrong exclude guest",
1019 !evsel
->core
.attr
.exclude_guest
);
1020 TEST_ASSERT_VAL("wrong exclude host",
1021 !evsel
->core
.attr
.exclude_host
);
1022 TEST_ASSERT_VAL("wrong precise_ip",
1023 evsel
->core
.attr
.precise_ip
== 3);
1024 if (evsel__has_leader(evsel
, group1_leader
)) {
1025 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1026 TEST_ASSERT_VAL("wrong group_idx",
1027 evsel__group_idx(evsel
) == 1);
1029 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1031 /* group2 cycles + G modifier */
1032 group2_leader
= evsel
;
1033 TEST_ASSERT_VAL("wrong exclude_kernel",
1034 !evsel
->core
.attr
.exclude_kernel
);
1035 TEST_ASSERT_VAL("wrong exclude_hv",
1036 !evsel
->core
.attr
.exclude_hv
);
1037 TEST_ASSERT_VAL("wrong exclude guest",
1038 !evsel
->core
.attr
.exclude_guest
);
1039 TEST_ASSERT_VAL("wrong exclude host",
1040 evsel
->core
.attr
.exclude_host
);
1041 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1042 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1043 if (evsel
->core
.nr_members
== 2) {
1044 TEST_ASSERT_VAL("wrong group_idx",
1045 evsel__group_idx(evsel
) == 0);
1047 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1051 if (evsel
->core
.attr
.type
== 1) {
1052 /* group2 1:3 + G modifier */
1053 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 3));
1054 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1055 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1056 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1057 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1058 TEST_ASSERT_VAL("wrong exclude host", evsel
->core
.attr
.exclude_host
);
1059 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1060 if (evsel__has_leader(evsel
, group2_leader
))
1061 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
1062 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1065 /* instructions:u */
1066 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_INSTRUCTIONS
, "instructions");
1070 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1071 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1072 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1073 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1074 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1075 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1076 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1077 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1083 static int test__group4(struct evlist
*evlist __maybe_unused
)
1085 struct evsel
*evsel
, *leader
;
1087 TEST_ASSERT_VAL("wrong number of entries",
1088 evlist
->core
.nr_entries
== (num_core_entries() * 2));
1089 TEST_ASSERT_VAL("wrong number of groups",
1090 num_core_entries() == evlist__nr_groups(evlist
));
1092 for (int i
= 0; i
< num_core_entries(); i
++) {
1096 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1097 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1101 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1102 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1103 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1104 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1105 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1106 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
== 1);
1107 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1108 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1109 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
1110 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
1111 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1113 /* instructions:kp + p */
1114 evsel
= evsel__next(evsel
);
1115 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_INSTRUCTIONS
, "instructions");
1119 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
1120 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1121 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1122 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1123 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1124 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
== 2);
1125 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1126 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
1127 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1132 static int test__group5(struct evlist
*evlist __maybe_unused
)
1134 struct evsel
*evsel
= NULL
, *leader
;
1137 TEST_ASSERT_VAL("wrong number of entries",
1138 evlist
->core
.nr_entries
== (5 * num_core_entries()));
1139 TEST_ASSERT_VAL("wrong number of groups",
1140 evlist__nr_groups(evlist
) == (2 * num_core_entries()));
1142 for (int i
= 0; i
< num_core_entries(); i
++) {
1144 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1145 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1149 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1150 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1151 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1152 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1153 TEST_ASSERT_VAL("wrong exclude host", evsel
->core
.attr
.exclude_host
);
1154 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1155 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1156 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1157 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
1158 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
1159 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1161 /* instructions + G */
1162 evsel
= evsel__next(evsel
);
1163 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_INSTRUCTIONS
, "instructions");
1167 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1168 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1169 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1170 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1171 TEST_ASSERT_VAL("wrong exclude host", evsel
->core
.attr
.exclude_host
);
1172 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1173 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1174 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
1175 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1177 for (int i
= 0; i
< num_core_entries(); i
++) {
1179 evsel
= leader
= evsel__next(evsel
);
1180 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1184 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1185 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1186 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1187 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1188 TEST_ASSERT_VAL("wrong exclude host", evsel
->core
.attr
.exclude_host
);
1189 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1190 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1191 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1192 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
1193 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
1194 TEST_ASSERT_VAL("wrong sample_read", !evsel
->sample_read
);
1196 /* instructions:G */
1197 evsel
= evsel__next(evsel
);
1198 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_INSTRUCTIONS
, "instructions");
1202 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1203 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1204 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1205 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1206 TEST_ASSERT_VAL("wrong exclude host", evsel
->core
.attr
.exclude_host
);
1207 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1208 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1209 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
1211 for (int i
= 0; i
< num_core_entries(); i
++) {
1213 evsel
= evsel__next(evsel
);
1214 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1218 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1219 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1220 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1221 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1222 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1223 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1224 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1229 static int test__group_gh1(struct evlist
*evlist
)
1231 struct evsel
*evsel
= NULL
, *leader
;
1233 TEST_ASSERT_VAL("wrong number of entries",
1234 evlist
->core
.nr_entries
== (2 * num_core_entries()));
1235 TEST_ASSERT_VAL("wrong number of groups",
1236 evlist__nr_groups(evlist
) == num_core_entries());
1238 for (int i
= 0; i
< num_core_entries(); i
++) {
1241 /* cycles + :H group modifier */
1242 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1243 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1247 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1248 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1249 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1250 TEST_ASSERT_VAL("wrong exclude guest", evsel
->core
.attr
.exclude_guest
);
1251 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1252 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1253 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1254 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1255 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
1256 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
1258 /* cache-misses:G + :H group modifier */
1259 evsel
= evsel__next(evsel
);
1260 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CACHE_MISSES
, "cache-misses");
1264 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1265 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1266 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1267 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1268 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1269 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1270 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1271 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
1276 static int test__group_gh2(struct evlist
*evlist
)
1278 struct evsel
*evsel
= NULL
, *leader
;
1280 TEST_ASSERT_VAL("wrong number of entries",
1281 evlist
->core
.nr_entries
== (2 * num_core_entries()));
1282 TEST_ASSERT_VAL("wrong number of groups",
1283 evlist__nr_groups(evlist
) == num_core_entries());
1285 for (int i
= 0; i
< num_core_entries(); i
++) {
1288 /* cycles + :G group modifier */
1289 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1290 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1294 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1295 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1296 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1297 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1298 TEST_ASSERT_VAL("wrong exclude host", evsel
->core
.attr
.exclude_host
);
1299 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1300 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1301 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1302 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
1303 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
1305 /* cache-misses:H + :G group modifier */
1306 evsel
= evsel__next(evsel
);
1307 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CACHE_MISSES
, "cache-misses");
1311 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1312 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1313 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1314 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1315 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1316 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1317 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1318 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
1323 static int test__group_gh3(struct evlist
*evlist
)
1325 struct evsel
*evsel
= NULL
, *leader
;
1327 TEST_ASSERT_VAL("wrong number of entries",
1328 evlist
->core
.nr_entries
== (2 * num_core_entries()));
1329 TEST_ASSERT_VAL("wrong number of groups",
1330 evlist__nr_groups(evlist
) == num_core_entries());
1332 for (int i
= 0; i
< num_core_entries(); i
++) {
1335 /* cycles:G + :u group modifier */
1336 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1337 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1341 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1342 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1343 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1344 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1345 TEST_ASSERT_VAL("wrong exclude host", evsel
->core
.attr
.exclude_host
);
1346 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1347 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1348 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1349 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
1350 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
1352 /* cache-misses:H + :u group modifier */
1353 evsel
= evsel__next(evsel
);
1354 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CACHE_MISSES
, "cache-misses");
1358 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1359 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1360 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1361 TEST_ASSERT_VAL("wrong exclude guest", evsel
->core
.attr
.exclude_guest
);
1362 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1363 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1364 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1365 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
1370 static int test__group_gh4(struct evlist
*evlist
)
1372 struct evsel
*evsel
= NULL
, *leader
;
1374 TEST_ASSERT_VAL("wrong number of entries",
1375 evlist
->core
.nr_entries
== (2 * num_core_entries()));
1376 TEST_ASSERT_VAL("wrong number of groups",
1377 evlist__nr_groups(evlist
) == num_core_entries());
1379 for (int i
= 0; i
< num_core_entries(); i
++) {
1382 /* cycles:G + :uG group modifier */
1383 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1384 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1388 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1389 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1390 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1391 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1392 TEST_ASSERT_VAL("wrong exclude host", evsel
->core
.attr
.exclude_host
);
1393 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1394 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1395 TEST_ASSERT_VAL("wrong leader", evsel__is_group_leader(evsel
));
1396 TEST_ASSERT_VAL("wrong core.nr_members", evsel
->core
.nr_members
== 2);
1397 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 0);
1399 /* cache-misses:H + :uG group modifier */
1400 evsel
= evsel__next(evsel
);
1401 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CACHE_MISSES
, "cache-misses");
1405 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1406 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1407 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1408 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1409 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1410 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1411 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1412 TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel
) == 1);
1417 static int test__leader_sample1(struct evlist
*evlist
)
1419 struct evsel
*evsel
= NULL
, *leader
;
1421 TEST_ASSERT_VAL("wrong number of entries",
1422 evlist
->core
.nr_entries
== (3 * num_core_entries()));
1424 for (int i
= 0; i
< num_core_entries(); i
++) {
1427 /* cycles - sampling group leader */
1428 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1429 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1433 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1434 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1435 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1436 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1437 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1438 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1439 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1440 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1441 TEST_ASSERT_VAL("wrong sample_read", evsel
->sample_read
);
1443 /* cache-misses - not sampling */
1444 evsel
= evsel__next(evsel
);
1445 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CACHE_MISSES
, "cache-misses");
1449 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1450 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1451 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1452 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1453 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1454 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1455 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1456 TEST_ASSERT_VAL("wrong sample_read", evsel
->sample_read
);
1458 /* branch-misses - not sampling */
1459 evsel
= evsel__next(evsel
);
1460 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_BRANCH_MISSES
, "branch-misses");
1464 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1465 TEST_ASSERT_VAL("wrong exclude_kernel", !evsel
->core
.attr
.exclude_kernel
);
1466 TEST_ASSERT_VAL("wrong exclude_hv", !evsel
->core
.attr
.exclude_hv
);
1467 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1468 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1469 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1470 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1471 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1472 TEST_ASSERT_VAL("wrong sample_read", evsel
->sample_read
);
1477 static int test__leader_sample2(struct evlist
*evlist __maybe_unused
)
1479 struct evsel
*evsel
= NULL
, *leader
;
1481 TEST_ASSERT_VAL("wrong number of entries",
1482 evlist
->core
.nr_entries
== (2 * num_core_entries()));
1484 for (int i
= 0; i
< num_core_entries(); i
++) {
1487 /* instructions - sampling group leader */
1488 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1489 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_INSTRUCTIONS
, "instructions");
1493 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1494 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1495 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1496 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1497 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1498 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1499 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1500 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1501 TEST_ASSERT_VAL("wrong sample_read", evsel
->sample_read
);
1503 /* branch-misses - not sampling */
1504 evsel
= evsel__next(evsel
);
1505 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_BRANCH_MISSES
, "branch-misses");
1509 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1510 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1511 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1512 TEST_ASSERT_VAL("wrong exclude guest", !evsel
->core
.attr
.exclude_guest
);
1513 TEST_ASSERT_VAL("wrong exclude host", !evsel
->core
.attr
.exclude_host
);
1514 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1515 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1516 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1517 TEST_ASSERT_VAL("wrong sample_read", evsel
->sample_read
);
1522 static int test__checkevent_pinned_modifier(struct evlist
*evlist
)
1524 struct evsel
*evsel
= NULL
;
1526 TEST_ASSERT_VAL("wrong number of entries",
1527 evlist
->core
.nr_entries
== num_core_entries());
1529 for (int i
= 0; i
< num_core_entries(); i
++) {
1530 evsel
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1531 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1532 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1533 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1534 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
);
1535 TEST_ASSERT_VAL("wrong pinned", evsel
->core
.attr
.pinned
);
1537 return test__checkevent_symbolic_name(evlist
);
1540 static int test__pinned_group(struct evlist
*evlist
)
1542 struct evsel
*evsel
= NULL
, *leader
;
1544 TEST_ASSERT_VAL("wrong number of entries",
1545 evlist
->core
.nr_entries
== (3 * num_core_entries()));
1547 for (int i
= 0; i
< num_core_entries(); i
++) {
1550 /* cycles - group leader */
1551 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1552 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1556 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1557 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1558 /* TODO: The group modifier is not copied to the split group leader. */
1559 if (perf_pmus__num_core_pmus() == 1)
1560 TEST_ASSERT_VAL("wrong pinned", evsel
->core
.attr
.pinned
);
1562 /* cache-misses - can not be pinned, but will go on with the leader */
1563 evsel
= evsel__next(evsel
);
1564 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CACHE_MISSES
, "cache-misses");
1568 TEST_ASSERT_VAL("wrong pinned", !evsel
->core
.attr
.pinned
);
1570 /* branch-misses - ditto */
1571 evsel
= evsel__next(evsel
);
1572 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_BRANCH_MISSES
, "branch-misses");
1576 TEST_ASSERT_VAL("wrong pinned", !evsel
->core
.attr
.pinned
);
1581 static int test__checkevent_exclusive_modifier(struct evlist
*evlist
)
1583 struct evsel
*evsel
= evlist__first(evlist
);
1585 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1586 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1587 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1588 TEST_ASSERT_VAL("wrong precise_ip", evsel
->core
.attr
.precise_ip
);
1589 TEST_ASSERT_VAL("wrong exclusive", evsel
->core
.attr
.exclusive
);
1591 return test__checkevent_symbolic_name(evlist
);
1594 static int test__exclusive_group(struct evlist
*evlist
)
1596 struct evsel
*evsel
= NULL
, *leader
;
1598 TEST_ASSERT_VAL("wrong number of entries",
1599 evlist
->core
.nr_entries
== 3 * num_core_entries());
1601 for (int i
= 0; i
< num_core_entries(); i
++) {
1604 /* cycles - group leader */
1605 evsel
= leader
= (i
== 0 ? evlist__first(evlist
) : evsel__next(evsel
));
1606 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1610 TEST_ASSERT_VAL("wrong group name", !evsel
->group_name
);
1611 TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel
, leader
));
1612 /* TODO: The group modifier is not copied to the split group leader. */
1613 if (perf_pmus__num_core_pmus() == 1)
1614 TEST_ASSERT_VAL("wrong exclusive", evsel
->core
.attr
.exclusive
);
1616 /* cache-misses - can not be pinned, but will go on with the leader */
1617 evsel
= evsel__next(evsel
);
1618 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CACHE_MISSES
, "cache-misses");
1622 TEST_ASSERT_VAL("wrong exclusive", !evsel
->core
.attr
.exclusive
);
1624 /* branch-misses - ditto */
1625 evsel
= evsel__next(evsel
);
1626 ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_BRANCH_MISSES
, "branch-misses");
1630 TEST_ASSERT_VAL("wrong exclusive", !evsel
->core
.attr
.exclusive
);
1634 static int test__checkevent_breakpoint_len(struct evlist
*evlist
)
1636 struct evsel
*evsel
= evlist__first(evlist
);
1638 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
1639 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT
== evsel
->core
.attr
.type
);
1640 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 0));
1641 TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R
| HW_BREAKPOINT_W
) ==
1642 evsel
->core
.attr
.bp_type
);
1643 TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_1
==
1644 evsel
->core
.attr
.bp_len
);
1649 static int test__checkevent_breakpoint_len_w(struct evlist
*evlist
)
1651 struct evsel
*evsel
= evlist__first(evlist
);
1653 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
1654 TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT
== evsel
->core
.attr
.type
);
1655 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 0));
1656 TEST_ASSERT_VAL("wrong bp_type", HW_BREAKPOINT_W
==
1657 evsel
->core
.attr
.bp_type
);
1658 TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_2
==
1659 evsel
->core
.attr
.bp_len
);
1665 test__checkevent_breakpoint_len_rw_modifier(struct evlist
*evlist
)
1667 struct evsel
*evsel
= evlist__first(evlist
);
1669 TEST_ASSERT_VAL("wrong exclude_user", !evsel
->core
.attr
.exclude_user
);
1670 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1671 TEST_ASSERT_VAL("wrong exclude_hv", evsel
->core
.attr
.exclude_hv
);
1672 TEST_ASSERT_VAL("wrong precise_ip", !evsel
->core
.attr
.precise_ip
);
1674 return test__checkevent_breakpoint_rw(evlist
);
1677 static int test__checkevent_precise_max_modifier(struct evlist
*evlist
)
1679 struct evsel
*evsel
= evlist__first(evlist
);
1681 TEST_ASSERT_VAL("wrong number of entries",
1682 evlist
->core
.nr_entries
== 1 + num_core_entries());
1683 TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE
== evsel
->core
.attr
.type
);
1684 TEST_ASSERT_VAL("wrong config", test_config(evsel
, PERF_COUNT_SW_TASK_CLOCK
));
1688 static int test__checkevent_config_symbol(struct evlist
*evlist
)
1690 struct evsel
*evsel
= evlist__first(evlist
);
1692 TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel
, "insn"));
1696 static int test__checkevent_config_raw(struct evlist
*evlist
)
1698 struct evsel
*evsel
= evlist__first(evlist
);
1700 TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel
, "rawpmu"));
1704 static int test__checkevent_config_num(struct evlist
*evlist
)
1706 struct evsel
*evsel
= evlist__first(evlist
);
1708 TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel
, "numpmu"));
1712 static int test__checkevent_config_cache(struct evlist
*evlist
)
1714 struct evsel
*evsel
= evlist__first(evlist
);
1716 TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel
, "cachepmu"));
1717 return test__checkevent_genhw(evlist
);
1720 static bool test__pmu_cpu_valid(void)
1722 return !!perf_pmus__find("cpu");
1725 static bool test__pmu_cpu_event_valid(void)
1727 struct perf_pmu
*pmu
= perf_pmus__find("cpu");
1732 return perf_pmu__has_format(pmu
, "event");
1735 static bool test__intel_pt_valid(void)
1737 return !!perf_pmus__find("intel_pt");
1740 static int test__intel_pt(struct evlist
*evlist
)
1742 struct evsel
*evsel
= evlist__first(evlist
);
1744 TEST_ASSERT_VAL("wrong name setting", evsel__name_is(evsel
, "intel_pt//u"));
1748 static int test__checkevent_complex_name(struct evlist
*evlist
)
1750 struct evsel
*evsel
= evlist__first(evlist
);
1752 TEST_ASSERT_VAL("wrong complex name parsing",
1753 evsel__name_is(evsel
,
1754 "COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks"));
1758 static int test__checkevent_raw_pmu(struct evlist
*evlist
)
1760 struct evsel
*evsel
= evlist__first(evlist
);
1762 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist
->core
.nr_entries
);
1763 TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE
== evsel
->core
.attr
.type
);
1764 TEST_ASSERT_VAL("wrong config", test_config(evsel
, 0x1a));
1768 static int test__sym_event_slash(struct evlist
*evlist
)
1770 struct evsel
*evsel
= evlist__first(evlist
);
1771 int ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1776 TEST_ASSERT_VAL("wrong exclude_kernel", evsel
->core
.attr
.exclude_kernel
);
1780 static int test__sym_event_dc(struct evlist
*evlist
)
1782 struct evsel
*evsel
= evlist__first(evlist
);
1783 int ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1788 TEST_ASSERT_VAL("wrong exclude_user", evsel
->core
.attr
.exclude_user
);
1792 static int test__term_equal_term(struct evlist
*evlist
)
1794 struct evsel
*evsel
= evlist__first(evlist
);
1795 int ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1800 TEST_ASSERT_VAL("wrong name setting", strcmp(evsel
->name
, "name") == 0);
1804 static int test__term_equal_legacy(struct evlist
*evlist
)
1806 struct evsel
*evsel
= evlist__first(evlist
);
1807 int ret
= assert_hw(&evsel
->core
, PERF_COUNT_HW_CPU_CYCLES
, "cycles");
1812 TEST_ASSERT_VAL("wrong name setting", strcmp(evsel
->name
, "l1d") == 0);
1816 #ifdef HAVE_LIBTRACEEVENT
1817 static int count_tracepoints(void)
1819 struct dirent
*events_ent
;
1823 events_dir
= tracing_events__opendir();
1825 TEST_ASSERT_VAL("Can't open events dir", events_dir
);
1827 while ((events_ent
= readdir(events_dir
))) {
1829 struct dirent
*sys_ent
;
1832 if (!strcmp(events_ent
->d_name
, ".")
1833 || !strcmp(events_ent
->d_name
, "..")
1834 || !strcmp(events_ent
->d_name
, "enable")
1835 || !strcmp(events_ent
->d_name
, "header_event")
1836 || !strcmp(events_ent
->d_name
, "header_page"))
1839 sys_path
= get_events_file(events_ent
->d_name
);
1840 TEST_ASSERT_VAL("Can't get sys path", sys_path
);
1842 sys_dir
= opendir(sys_path
);
1843 TEST_ASSERT_VAL("Can't open sys dir", sys_dir
);
1845 while ((sys_ent
= readdir(sys_dir
))) {
1846 if (!strcmp(sys_ent
->d_name
, ".")
1847 || !strcmp(sys_ent
->d_name
, "..")
1848 || !strcmp(sys_ent
->d_name
, "enable")
1849 || !strcmp(sys_ent
->d_name
, "filter"))
1856 put_events_file(sys_path
);
1859 closedir(events_dir
);
1863 static int test__all_tracepoints(struct evlist
*evlist
)
1865 TEST_ASSERT_VAL("wrong events count",
1866 count_tracepoints() == evlist
->core
.nr_entries
);
1868 return test__checkevent_tracepoint_multi(evlist
);
1870 #endif /* HAVE_LIBTRACEVENT */
1872 struct evlist_test
{
1874 bool (*valid
)(void);
1875 int (*check
)(struct evlist
*evlist
);
1878 static const struct evlist_test test__events
[] = {
1879 #ifdef HAVE_LIBTRACEEVENT
1881 .name
= "syscalls:sys_enter_openat",
1882 .check
= test__checkevent_tracepoint
,
1886 .name
= "syscalls:*",
1887 .check
= test__checkevent_tracepoint_multi
,
1893 .check
= test__checkevent_raw
,
1898 .check
= test__checkevent_numeric
,
1902 .name
= "instructions",
1903 .check
= test__checkevent_symbolic_name
,
1907 .name
= "cycles/period=100000,config2/",
1908 .check
= test__checkevent_symbolic_name_config
,
1913 .check
= test__checkevent_symbolic_alias
,
1917 .name
= "L1-dcache-load-miss",
1918 .check
= test__checkevent_genhw
,
1923 .check
= test__checkevent_breakpoint
,
1928 .check
= test__checkevent_breakpoint_x
,
1933 .check
= test__checkevent_breakpoint_r
,
1938 .check
= test__checkevent_breakpoint_w
,
1941 #ifdef HAVE_LIBTRACEEVENT
1943 .name
= "syscalls:sys_enter_openat:k",
1944 .check
= test__checkevent_tracepoint_modifier
,
1948 .name
= "syscalls:*:u",
1949 .check
= test__checkevent_tracepoint_multi_modifier
,
1955 .check
= test__checkevent_raw_modifier
,
1960 .check
= test__checkevent_numeric_modifier
,
1964 .name
= "instructions:h",
1965 .check
= test__checkevent_symbolic_name_modifier
,
1970 .check
= test__checkevent_symbolic_alias_modifier
,
1974 .name
= "L1-dcache-load-miss:kp",
1975 .check
= test__checkevent_genhw_modifier
,
1980 .check
= test__checkevent_breakpoint_modifier
,
1984 .name
= "mem:0:x:k",
1985 .check
= test__checkevent_breakpoint_x_modifier
,
1989 .name
= "mem:0:r:hp",
1990 .check
= test__checkevent_breakpoint_r_modifier
,
1994 .name
= "mem:0:w:up",
1995 .check
= test__checkevent_breakpoint_w_modifier
,
1998 #ifdef HAVE_LIBTRACEEVENT
2000 .name
= "r1,syscalls:sys_enter_openat:k,1:1:hp",
2001 .check
= test__checkevent_list
,
2006 .name
= "instructions:G",
2007 .check
= test__checkevent_exclude_host_modifier
,
2011 .name
= "instructions:H",
2012 .check
= test__checkevent_exclude_guest_modifier
,
2017 .check
= test__checkevent_breakpoint_rw
,
2021 .name
= "mem:0:rw:kp",
2022 .check
= test__checkevent_breakpoint_rw_modifier
,
2026 .name
= "{instructions:k,cycles:upp}",
2027 .check
= test__group1
,
2031 .name
= "{faults:k,branches}:u,cycles:k",
2032 .check
= test__group2
,
2035 #ifdef HAVE_LIBTRACEEVENT
2037 .name
= "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
2038 .check
= test__group3
,
2043 .name
= "{cycles:u,instructions:kp}:p",
2044 .check
= test__group4
,
2048 .name
= "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
2049 .check
= test__group5
,
2052 #ifdef HAVE_LIBTRACEEVENT
2055 .check
= test__all_tracepoints
,
2060 .name
= "{cycles,cache-misses:G}:H",
2061 .check
= test__group_gh1
,
2065 .name
= "{cycles,cache-misses:H}:G",
2066 .check
= test__group_gh2
,
2070 .name
= "{cycles:G,cache-misses:H}:u",
2071 .check
= test__group_gh3
,
2075 .name
= "{cycles:G,cache-misses:H}:uG",
2076 .check
= test__group_gh4
,
2080 .name
= "{cycles,cache-misses,branch-misses}:S",
2081 .check
= test__leader_sample1
,
2085 .name
= "{instructions,branch-misses}:Su",
2086 .check
= test__leader_sample2
,
2090 .name
= "instructions:uDp",
2091 .check
= test__checkevent_pinned_modifier
,
2095 .name
= "{cycles,cache-misses,branch-misses}:D",
2096 .check
= test__pinned_group
,
2101 .check
= test__checkevent_breakpoint_len
,
2105 .name
= "mem:0/2:w",
2106 .check
= test__checkevent_breakpoint_len_w
,
2110 .name
= "mem:0/4:rw:u",
2111 .check
= test__checkevent_breakpoint_len_rw_modifier
,
2114 #if defined(__s390x__) && defined(HAVE_LIBTRACEEVENT)
2116 .name
= "kvm-s390:kvm_s390_create_vm",
2117 .check
= test__checkevent_tracepoint
,
2118 .valid
= kvm_s390_create_vm_valid
,
2123 .name
= "instructions:I",
2124 .check
= test__checkevent_exclude_idle_modifier
,
2128 .name
= "instructions:kIG",
2129 .check
= test__checkevent_exclude_idle_modifier_1
,
2133 .name
= "task-clock:P,cycles",
2134 .check
= test__checkevent_precise_max_modifier
,
2138 .name
= "instructions/name=insn/",
2139 .check
= test__checkevent_config_symbol
,
2143 .name
= "r1234/name=rawpmu/",
2144 .check
= test__checkevent_config_raw
,
2148 .name
= "4:0x6530160/name=numpmu/",
2149 .check
= test__checkevent_config_num
,
2153 .name
= "L1-dcache-misses/name=cachepmu/",
2154 .check
= test__checkevent_config_cache
,
2158 .name
= "intel_pt//u",
2159 .valid
= test__intel_pt_valid
,
2160 .check
= test__intel_pt
,
2164 .name
= "cycles/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks'/Duk",
2165 .check
= test__checkevent_complex_name
,
2169 .name
= "cycles//u",
2170 .check
= test__sym_event_slash
,
2175 .check
= test__sym_event_dc
,
2179 .name
= "instructions:uep",
2180 .check
= test__checkevent_exclusive_modifier
,
2184 .name
= "{cycles,cache-misses,branch-misses}:e",
2185 .check
= test__exclusive_group
,
2189 .name
= "cycles/name=name/",
2190 .check
= test__term_equal_term
,
2194 .name
= "cycles/name=l1d/",
2195 .check
= test__term_equal_legacy
,
2199 .name
= "mem:0/name=breakpoint/",
2200 .check
= test__checkevent_breakpoint
,
2204 .name
= "mem:0:x/name=breakpoint/",
2205 .check
= test__checkevent_breakpoint_x
,
2209 .name
= "mem:0:r/name=breakpoint/",
2210 .check
= test__checkevent_breakpoint_r
,
2214 .name
= "mem:0:w/name=breakpoint/",
2215 .check
= test__checkevent_breakpoint_w
,
2219 .name
= "mem:0/name=breakpoint/u",
2220 .check
= test__checkevent_breakpoint_modifier_name
,
2224 .name
= "mem:0:x/name=breakpoint/k",
2225 .check
= test__checkevent_breakpoint_x_modifier_name
,
2229 .name
= "mem:0:r/name=breakpoint/hp",
2230 .check
= test__checkevent_breakpoint_r_modifier_name
,
2234 .name
= "mem:0:w/name=breakpoint/up",
2235 .check
= test__checkevent_breakpoint_w_modifier_name
,
2239 .name
= "mem:0:rw/name=breakpoint/",
2240 .check
= test__checkevent_breakpoint_rw
,
2244 .name
= "mem:0:rw/name=breakpoint/kp",
2245 .check
= test__checkevent_breakpoint_rw_modifier_name
,
2249 .name
= "mem:0/1/name=breakpoint/",
2250 .check
= test__checkevent_breakpoint_len
,
2254 .name
= "mem:0/2:w/name=breakpoint/",
2255 .check
= test__checkevent_breakpoint_len_w
,
2259 .name
= "mem:0/4:rw/name=breakpoint/u",
2260 .check
= test__checkevent_breakpoint_len_rw_modifier
,
2264 .name
= "mem:0/1/name=breakpoint1/,mem:0/4:rw/name=breakpoint2/",
2265 .check
= test__checkevent_breakpoint_2_events
,
2268 #ifdef HAVE_LIBTRACEEVENT
2270 .name
= "9p:9p_client_req",
2271 .check
= test__checkevent_tracepoint
,
2277 static const struct evlist_test test__events_pmu
[] = {
2279 .name
= "cpu/config=10,config1=1,config2=3,period=1000/u",
2280 .valid
= test__pmu_cpu_valid
,
2281 .check
= test__checkevent_pmu
,
2285 .name
= "cpu/config=1,name=krava/u,cpu/config=2/u",
2286 .valid
= test__pmu_cpu_valid
,
2287 .check
= test__checkevent_pmu_name
,
2291 .name
= "cpu/config=1,call-graph=fp,time,period=100000/,cpu/config=2,call-graph=no,time=0,period=2000/",
2292 .valid
= test__pmu_cpu_valid
,
2293 .check
= test__checkevent_pmu_partial_time_callgraph
,
2297 .name
= "cpu/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks',period=0x1,event=0x2/ukp",
2298 .valid
= test__pmu_cpu_event_valid
,
2299 .check
= test__checkevent_complex_name
,
2303 .name
= "software/r1a/",
2304 .check
= test__checkevent_raw_pmu
,
2308 .name
= "software/r0x1a/",
2309 .check
= test__checkevent_raw_pmu
,
2313 .name
= "cpu/L1-dcache-load-miss/",
2314 .valid
= test__pmu_cpu_valid
,
2315 .check
= test__checkevent_genhw
,
2319 .name
= "cpu/L1-dcache-load-miss/kp",
2320 .valid
= test__pmu_cpu_valid
,
2321 .check
= test__checkevent_genhw_modifier
,
2325 .name
= "cpu/L1-dcache-misses,name=cachepmu/",
2326 .valid
= test__pmu_cpu_valid
,
2327 .check
= test__checkevent_config_cache
,
2331 .name
= "cpu/instructions/",
2332 .valid
= test__pmu_cpu_valid
,
2333 .check
= test__checkevent_symbolic_name
,
2337 .name
= "cpu/cycles,period=100000,config2/",
2338 .valid
= test__pmu_cpu_valid
,
2339 .check
= test__checkevent_symbolic_name_config
,
2343 .name
= "cpu/instructions/h",
2344 .valid
= test__pmu_cpu_valid
,
2345 .check
= test__checkevent_symbolic_name_modifier
,
2349 .name
= "cpu/instructions/G",
2350 .valid
= test__pmu_cpu_valid
,
2351 .check
= test__checkevent_exclude_host_modifier
,
2355 .name
= "cpu/instructions/H",
2356 .valid
= test__pmu_cpu_valid
,
2357 .check
= test__checkevent_exclude_guest_modifier
,
2361 .name
= "{cpu/instructions/k,cpu/cycles/upp}",
2362 .valid
= test__pmu_cpu_valid
,
2363 .check
= test__group1
,
2367 .name
= "{cpu/cycles/u,cpu/instructions/kp}:p",
2368 .valid
= test__pmu_cpu_valid
,
2369 .check
= test__group4
,
2373 .name
= "{cpu/cycles/,cpu/cache-misses/G}:H",
2374 .valid
= test__pmu_cpu_valid
,
2375 .check
= test__group_gh1
,
2379 .name
= "{cpu/cycles/,cpu/cache-misses/H}:G",
2380 .valid
= test__pmu_cpu_valid
,
2381 .check
= test__group_gh2
,
2385 .name
= "{cpu/cycles/G,cpu/cache-misses/H}:u",
2386 .valid
= test__pmu_cpu_valid
,
2387 .check
= test__group_gh3
,
2391 .name
= "{cpu/cycles/G,cpu/cache-misses/H}:uG",
2392 .valid
= test__pmu_cpu_valid
,
2393 .check
= test__group_gh4
,
2397 .name
= "{cpu/cycles/,cpu/cache-misses/,cpu/branch-misses/}:S",
2398 .valid
= test__pmu_cpu_valid
,
2399 .check
= test__leader_sample1
,
2403 .name
= "{cpu/instructions/,cpu/branch-misses/}:Su",
2404 .valid
= test__pmu_cpu_valid
,
2405 .check
= test__leader_sample2
,
2409 .name
= "cpu/instructions/uDp",
2410 .valid
= test__pmu_cpu_valid
,
2411 .check
= test__checkevent_pinned_modifier
,
2415 .name
= "{cpu/cycles/,cpu/cache-misses/,cpu/branch-misses/}:D",
2416 .valid
= test__pmu_cpu_valid
,
2417 .check
= test__pinned_group
,
2421 .name
= "cpu/instructions/I",
2422 .valid
= test__pmu_cpu_valid
,
2423 .check
= test__checkevent_exclude_idle_modifier
,
2427 .name
= "cpu/instructions/kIG",
2428 .valid
= test__pmu_cpu_valid
,
2429 .check
= test__checkevent_exclude_idle_modifier_1
,
2433 .name
= "cpu/cycles/u",
2434 .valid
= test__pmu_cpu_valid
,
2435 .check
= test__sym_event_slash
,
2439 .name
= "cpu/cycles/k",
2440 .valid
= test__pmu_cpu_valid
,
2441 .check
= test__sym_event_dc
,
2445 .name
= "cpu/instructions/uep",
2446 .valid
= test__pmu_cpu_valid
,
2447 .check
= test__checkevent_exclusive_modifier
,
2451 .name
= "{cpu/cycles/,cpu/cache-misses/,cpu/branch-misses/}:e",
2452 .valid
= test__pmu_cpu_valid
,
2453 .check
= test__exclusive_group
,
2457 .name
= "cpu/cycles,name=name/",
2458 .valid
= test__pmu_cpu_valid
,
2459 .check
= test__term_equal_term
,
2463 .name
= "cpu/cycles,name=l1d/",
2464 .valid
= test__pmu_cpu_valid
,
2465 .check
= test__term_equal_legacy
,
2472 int (*check
)(struct parse_events_terms
*terms
);
2475 static const struct terms_test test__terms
[] = {
2477 .str
= "config=10,config1,config2=3,config3=4,umask=1,read,r0xead",
2478 .check
= test__checkterms_simple
,
2482 static int test_event(const struct evlist_test
*e
)
2484 struct parse_events_error err
;
2485 struct evlist
*evlist
;
2488 if (e
->valid
&& !e
->valid()) {
2489 pr_debug("... SKIP\n");
2493 evlist
= evlist__new();
2494 if (evlist
== NULL
) {
2495 pr_err("Failed allocation");
2498 parse_events_error__init(&err
);
2499 ret
= __parse_events(evlist
, e
->name
, /*pmu_filter=*/NULL
, &err
, /*fake_pmu=*/false,
2500 /*warn_if_reordered=*/true, /*fake_tp=*/true);
2502 pr_debug("failed to parse event '%s', err %d\n", e
->name
, ret
);
2503 parse_events_error__print(&err
, e
->name
);
2505 if (parse_events_error__contains(&err
, "can't access trace events"))
2508 ret
= e
->check(evlist
);
2510 parse_events_error__exit(&err
);
2511 evlist__delete(evlist
);
2516 static int test_event_fake_pmu(const char *str
)
2518 struct parse_events_error err
;
2519 struct evlist
*evlist
;
2522 evlist
= evlist__new();
2526 parse_events_error__init(&err
);
2527 ret
= __parse_events(evlist
, str
, /*pmu_filter=*/NULL
, &err
,
2528 /*fake_pmu=*/true, /*warn_if_reordered=*/true,
2531 pr_debug("failed to parse event '%s', err %d\n",
2533 parse_events_error__print(&err
, str
);
2536 parse_events_error__exit(&err
);
2537 evlist__delete(evlist
);
2542 static int combine_test_results(int existing
, int latest
)
2544 if (existing
== TEST_FAIL
)
2546 if (existing
== TEST_SKIP
)
2547 return latest
== TEST_OK
? TEST_SKIP
: latest
;
2551 static int test_events(const struct evlist_test
*events
, int cnt
)
2555 for (int i
= 0; i
< cnt
; i
++) {
2556 const struct evlist_test
*e
= &events
[i
];
2559 pr_debug("running test %d '%s'\n", i
, e
->name
);
2560 test_ret
= test_event(e
);
2561 if (test_ret
!= TEST_OK
) {
2562 pr_debug("Event test failure: test %d '%s'", i
, e
->name
);
2563 ret
= combine_test_results(ret
, test_ret
);
2570 static int test__events2(struct test_suite
*test __maybe_unused
, int subtest __maybe_unused
)
2572 return test_events(test__events
, ARRAY_SIZE(test__events
));
2575 static int test_term(const struct terms_test
*t
)
2577 struct parse_events_terms terms
;
2581 parse_events_terms__init(&terms
);
2582 ret
= parse_events_terms(&terms
, t
->str
, /*input=*/ NULL
);
2584 pr_debug("failed to parse terms '%s', err %d\n",
2589 ret
= t
->check(&terms
);
2590 parse_events_terms__exit(&terms
);
2595 static int test_terms(const struct terms_test
*terms
, int cnt
)
2599 for (int i
= 0; i
< cnt
; i
++) {
2600 const struct terms_test
*t
= &terms
[i
];
2602 pr_debug("running test %d '%s'\n", i
, t
->str
);
2611 static int test__terms2(struct test_suite
*test __maybe_unused
, int subtest __maybe_unused
)
2613 return test_terms(test__terms
, ARRAY_SIZE(test__terms
));
2616 static int test__pmu_events(struct test_suite
*test __maybe_unused
, int subtest __maybe_unused
)
2618 struct perf_pmu
*pmu
= NULL
;
2621 while ((pmu
= perf_pmus__scan(pmu
)) != NULL
) {
2623 char path
[PATH_MAX
];
2624 char pmu_event
[PATH_MAX
];
2633 snprintf(path
, PATH_MAX
, "%s/bus/event_source/devices/%s/events/",
2634 sysfs__mountpoint(), pmu
->name
);
2636 err
= stat(path
, &st
);
2638 pr_debug("skipping PMU %s events tests: %s\n", pmu
->name
, path
);
2642 dir
= opendir(path
);
2644 pr_debug("can't open pmu event dir: %s\n", path
);
2645 ret
= combine_test_results(ret
, TEST_SKIP
);
2649 while ((ent
= readdir(dir
))) {
2650 struct evlist_test e
= { .name
= NULL
, };
2651 char name
[2 * NAME_MAX
+ 1 + 12 + 3];
2653 bool is_event_parameterized
= 0;
2655 /* Names containing . are special and cannot be used directly */
2656 if (strchr(ent
->d_name
, '.'))
2659 /* exclude parameterized ones (name contains '?') */
2660 n
= snprintf(pmu_event
, sizeof(pmu_event
), "%s%s", path
, ent
->d_name
);
2661 if (n
>= PATH_MAX
) {
2662 pr_err("pmu event name crossed PATH_MAX(%d) size\n", PATH_MAX
);
2666 file
= fopen(pmu_event
, "r");
2668 pr_debug("can't open pmu event file for '%s'\n", ent
->d_name
);
2669 ret
= combine_test_results(ret
, TEST_FAIL
);
2673 if (getline(&buf
, &len
, file
) < 0) {
2674 pr_debug(" pmu event: %s is a null event\n", ent
->d_name
);
2675 ret
= combine_test_results(ret
, TEST_FAIL
);
2680 if (strchr(buf
, '?'))
2681 is_event_parameterized
= 1;
2687 if (is_event_parameterized
== 1) {
2688 pr_debug("skipping parameterized PMU event: %s which contains ?\n", pmu_event
);
2692 snprintf(name
, sizeof(name
), "%s/event=%s/u", pmu
->name
, ent
->d_name
);
2695 e
.check
= test__checkevent_pmu_events
;
2697 test_ret
= test_event(&e
);
2698 if (test_ret
!= TEST_OK
) {
2699 pr_debug("Test PMU event failed for '%s'", name
);
2700 ret
= combine_test_results(ret
, test_ret
);
2703 if (!is_pmu_core(pmu
->name
))
2707 * Names containing '-' are recognized as prefixes and suffixes
2708 * due to '-' being a legacy PMU separator. This fails when the
2709 * prefix or suffix collides with an existing legacy token. For
2710 * example, branch-brs has a prefix (branch) that collides with
2711 * a PE_NAME_CACHE_TYPE token causing a parse error as a suffix
2712 * isn't expected after this. As event names in the config
2713 * slashes are allowed a '-' in the name we check this works
2716 if (strchr(ent
->d_name
, '-'))
2719 snprintf(name
, sizeof(name
), "%s:u,%s/event=%s/u",
2720 ent
->d_name
, pmu
->name
, ent
->d_name
);
2722 e
.check
= test__checkevent_pmu_events_mix
;
2723 test_ret
= test_event(&e
);
2724 if (test_ret
!= TEST_OK
) {
2725 pr_debug("Test PMU event failed for '%s'", name
);
2726 ret
= combine_test_results(ret
, test_ret
);
2735 static int test__pmu_events2(struct test_suite
*test __maybe_unused
, int subtest __maybe_unused
)
2737 return test_events(test__events_pmu
, ARRAY_SIZE(test__events_pmu
));
2740 static bool test_alias(char **event
, char **alias
)
2742 char path
[PATH_MAX
];
2744 struct dirent
*dent
;
2745 const char *sysfs
= sysfs__mountpoint();
2752 snprintf(path
, PATH_MAX
, "%s/bus/event_source/devices/", sysfs
);
2753 dir
= opendir(path
);
2757 while ((dent
= readdir(dir
))) {
2758 if (!strcmp(dent
->d_name
, ".") ||
2759 !strcmp(dent
->d_name
, ".."))
2762 snprintf(path
, PATH_MAX
, "%s/bus/event_source/devices/%s/alias",
2763 sysfs
, dent
->d_name
);
2765 if (!file_available(path
))
2768 file
= fopen(path
, "r");
2772 if (!fgets(buf
, sizeof(buf
), file
)) {
2777 /* Remove the last '\n' */
2778 buf
[strlen(buf
) - 1] = 0;
2781 *event
= strdup(dent
->d_name
);
2782 *alias
= strdup(buf
);
2785 if (*event
== NULL
|| *alias
== NULL
) {
2798 static int test__checkevent_pmu_events_alias(struct evlist
*evlist
)
2800 struct evsel
*evsel1
= evlist__first(evlist
);
2801 struct evsel
*evsel2
= evlist__last(evlist
);
2803 TEST_ASSERT_VAL("wrong type", evsel1
->core
.attr
.type
== evsel2
->core
.attr
.type
);
2804 TEST_ASSERT_VAL("wrong config", evsel1
->core
.attr
.config
== evsel2
->core
.attr
.config
);
2808 static int test__pmu_events_alias(char *event
, char *alias
)
2810 struct evlist_test e
= { .name
= NULL
, };
2811 char name
[2 * NAME_MAX
+ 20];
2813 snprintf(name
, sizeof(name
), "%s/event=1/,%s/event=1/",
2817 e
.check
= test__checkevent_pmu_events_alias
;
2818 return test_event(&e
);
2821 static int test__alias(struct test_suite
*test __maybe_unused
, int subtest __maybe_unused
)
2823 char *event
, *alias
;
2826 if (!test_alias(&event
, &alias
))
2829 ret
= test__pmu_events_alias(event
, alias
);
2836 static int test__pmu_events_alias2(struct test_suite
*test __maybe_unused
,
2837 int subtest __maybe_unused
)
2839 static const char events
[][30] = {
2845 for (unsigned int i
= 0; i
< ARRAY_SIZE(events
); i
++) {
2846 int test_ret
= test_event_fake_pmu(&events
[i
][0]);
2848 if (test_ret
!= TEST_OK
) {
2849 pr_debug("check_parse_fake %s failed\n", &events
[i
][0]);
2850 ret
= combine_test_results(ret
, test_ret
);
2857 static struct test_case tests__parse_events
[] = {
2858 TEST_CASE_REASON("Test event parsing",
2861 TEST_CASE_REASON("Parsing of all PMU events from sysfs",
2864 TEST_CASE_REASON("Parsing of given PMU events from sysfs",
2867 TEST_CASE_REASON("Parsing of aliased events from sysfs", alias
,
2868 "no aliases in sysfs"),
2869 TEST_CASE("Parsing of aliased events", pmu_events_alias2
),
2870 TEST_CASE("Parsing of terms (event modifiers)", terms2
),
2874 struct test_suite suite__parse_events
= {
2875 .desc
= "Parse event definition strings",
2876 .test_cases
= tests__parse_events
,