Skip to content

Commit bcd981d

Browse files
James-A-Clarknamhyung
authored andcommitted
perf test: Fix event parsing test when PERF_PMU_CAP_EXTENDED_HW_TYPE isn't supported.
Arm has multiple PMU types for heterogeneous systems, but doesn't currently support PERF_PMU_CAP_EXTENDED_HW_TYPE. Make the tests support both scenarios so that they pass on Arm, and will still pass once PERF_PMU_CAP_EXTENDED_HW_TYPE support is added. Fixes: 27c9fcf ("perf test: Update parse-events expectations to test for multiple events") Acked-by: Ian Rogers <[email protected]> Signed-off-by: James Clark <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Arnaldo Carvalho de Melo <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Ingo Molnar <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Namhyung Kim <[email protected]>
1 parent 808ce56 commit bcd981d

File tree

1 file changed

+50
-36
lines changed

1 file changed

+50
-36
lines changed

tools/perf/tests/parse-events.c

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@
2020
#define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
2121
PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
2222

23+
static int num_core_entries(void)
24+
{
25+
/*
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
29+
* PMUs
30+
*/
31+
if (perf_pmus__supports_extended_type())
32+
return perf_pmus__num_core_pmus();
33+
34+
return 1;
35+
}
36+
2337
static bool test_config(const struct evsel *evsel, __u64 expected_config)
2438
{
2539
__u32 type = evsel->core.attr.type;
@@ -339,7 +353,7 @@ static int test__checkevent_symbolic_name_modifier(struct evlist *evlist)
339353
struct perf_evsel *evsel;
340354

341355
TEST_ASSERT_VAL("wrong number of entries",
342-
evlist->core.nr_entries == perf_pmus__num_core_pmus());
356+
evlist->core.nr_entries == num_core_entries());
343357

344358
perf_evlist__for_each_entry(&evlist->core, evsel) {
345359
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
@@ -842,11 +856,11 @@ static int test__group1(struct evlist *evlist)
842856
struct evsel *evsel, *leader;
843857

844858
TEST_ASSERT_VAL("wrong number of entries",
845-
evlist->core.nr_entries == (perf_pmus__num_core_pmus() * 2));
859+
evlist->core.nr_entries == (num_core_entries() * 2));
846860
TEST_ASSERT_VAL("wrong number of groups",
847-
evlist__nr_groups(evlist) == perf_pmus__num_core_pmus());
861+
evlist__nr_groups(evlist) == num_core_entries());
848862

849-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
863+
for (int i = 0; i < num_core_entries(); i++) {
850864
/* instructions:k */
851865
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
852866
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -885,7 +899,7 @@ static int test__group2(struct evlist *evlist)
885899
struct evsel *evsel, *leader = NULL;
886900

887901
TEST_ASSERT_VAL("wrong number of entries",
888-
evlist->core.nr_entries == (2 * perf_pmus__num_core_pmus() + 1));
902+
evlist->core.nr_entries == (2 * num_core_entries() + 1));
889903
/*
890904
* TODO: Currently the software event won't be grouped with the hardware
891905
* event except for 1 PMU.
@@ -1051,11 +1065,11 @@ static int test__group4(struct evlist *evlist __maybe_unused)
10511065
struct evsel *evsel, *leader;
10521066

10531067
TEST_ASSERT_VAL("wrong number of entries",
1054-
evlist->core.nr_entries == (perf_pmus__num_core_pmus() * 2));
1068+
evlist->core.nr_entries == (num_core_entries() * 2));
10551069
TEST_ASSERT_VAL("wrong number of groups",
1056-
perf_pmus__num_core_pmus() == evlist__nr_groups(evlist));
1070+
num_core_entries() == evlist__nr_groups(evlist));
10571071

1058-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1072+
for (int i = 0; i < num_core_entries(); i++) {
10591073
/* cycles:u + p */
10601074
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
10611075
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1096,11 +1110,11 @@ static int test__group5(struct evlist *evlist __maybe_unused)
10961110
struct evsel *evsel = NULL, *leader;
10971111

10981112
TEST_ASSERT_VAL("wrong number of entries",
1099-
evlist->core.nr_entries == (5 * perf_pmus__num_core_pmus()));
1113+
evlist->core.nr_entries == (5 * num_core_entries()));
11001114
TEST_ASSERT_VAL("wrong number of groups",
1101-
evlist__nr_groups(evlist) == (2 * perf_pmus__num_core_pmus()));
1115+
evlist__nr_groups(evlist) == (2 * num_core_entries()));
11021116

1103-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1117+
for (int i = 0; i < num_core_entries(); i++) {
11041118
/* cycles + G */
11051119
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
11061120
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1131,7 +1145,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
11311145
TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
11321146
TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
11331147
}
1134-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1148+
for (int i = 0; i < num_core_entries(); i++) {
11351149
/* cycles:G */
11361150
evsel = leader = evsel__next(evsel);
11371151
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1161,7 +1175,7 @@ static int test__group5(struct evlist *evlist __maybe_unused)
11611175
TEST_ASSERT_VAL("wrong leader", evsel__has_leader(evsel, leader));
11621176
TEST_ASSERT_VAL("wrong group_idx", evsel__group_idx(evsel) == 1);
11631177
}
1164-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1178+
for (int i = 0; i < num_core_entries(); i++) {
11651179
/* cycles */
11661180
evsel = evsel__next(evsel);
11671181
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1182,11 +1196,11 @@ static int test__group_gh1(struct evlist *evlist)
11821196
struct evsel *evsel = NULL, *leader;
11831197

11841198
TEST_ASSERT_VAL("wrong number of entries",
1185-
evlist->core.nr_entries == (2 * perf_pmus__num_core_pmus()));
1199+
evlist->core.nr_entries == (2 * num_core_entries()));
11861200
TEST_ASSERT_VAL("wrong number of groups",
1187-
evlist__nr_groups(evlist) == perf_pmus__num_core_pmus());
1201+
evlist__nr_groups(evlist) == num_core_entries());
11881202

1189-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1203+
for (int i = 0; i < num_core_entries(); i++) {
11901204
/* cycles + :H group modifier */
11911205
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
11921206
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1223,11 +1237,11 @@ static int test__group_gh2(struct evlist *evlist)
12231237
struct evsel *evsel = NULL, *leader;
12241238

12251239
TEST_ASSERT_VAL("wrong number of entries",
1226-
evlist->core.nr_entries == (2 * perf_pmus__num_core_pmus()));
1240+
evlist->core.nr_entries == (2 * num_core_entries()));
12271241
TEST_ASSERT_VAL("wrong number of groups",
1228-
evlist__nr_groups(evlist) == perf_pmus__num_core_pmus());
1242+
evlist__nr_groups(evlist) == num_core_entries());
12291243

1230-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1244+
for (int i = 0; i < num_core_entries(); i++) {
12311245
/* cycles + :G group modifier */
12321246
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
12331247
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1264,11 +1278,11 @@ static int test__group_gh3(struct evlist *evlist)
12641278
struct evsel *evsel = NULL, *leader;
12651279

12661280
TEST_ASSERT_VAL("wrong number of entries",
1267-
evlist->core.nr_entries == (2 * perf_pmus__num_core_pmus()));
1281+
evlist->core.nr_entries == (2 * num_core_entries()));
12681282
TEST_ASSERT_VAL("wrong number of groups",
1269-
evlist__nr_groups(evlist) == perf_pmus__num_core_pmus());
1283+
evlist__nr_groups(evlist) == num_core_entries());
12701284

1271-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1285+
for (int i = 0; i < num_core_entries(); i++) {
12721286
/* cycles:G + :u group modifier */
12731287
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
12741288
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1305,11 +1319,11 @@ static int test__group_gh4(struct evlist *evlist)
13051319
struct evsel *evsel = NULL, *leader;
13061320

13071321
TEST_ASSERT_VAL("wrong number of entries",
1308-
evlist->core.nr_entries == (2 * perf_pmus__num_core_pmus()));
1322+
evlist->core.nr_entries == (2 * num_core_entries()));
13091323
TEST_ASSERT_VAL("wrong number of groups",
1310-
evlist__nr_groups(evlist) == perf_pmus__num_core_pmus());
1324+
evlist__nr_groups(evlist) == num_core_entries());
13111325

1312-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1326+
for (int i = 0; i < num_core_entries(); i++) {
13131327
/* cycles:G + :uG group modifier */
13141328
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
13151329
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1346,9 +1360,9 @@ static int test__leader_sample1(struct evlist *evlist)
13461360
struct evsel *evsel = NULL, *leader;
13471361

13481362
TEST_ASSERT_VAL("wrong number of entries",
1349-
evlist->core.nr_entries == (3 * perf_pmus__num_core_pmus()));
1363+
evlist->core.nr_entries == (3 * num_core_entries()));
13501364

1351-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1365+
for (int i = 0; i < num_core_entries(); i++) {
13521366
/* cycles - sampling group leader */
13531367
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
13541368
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1398,9 +1412,9 @@ static int test__leader_sample2(struct evlist *evlist __maybe_unused)
13981412
struct evsel *evsel = NULL, *leader;
13991413

14001414
TEST_ASSERT_VAL("wrong number of entries",
1401-
evlist->core.nr_entries == (2 * perf_pmus__num_core_pmus()));
1415+
evlist->core.nr_entries == (2 * num_core_entries()));
14021416

1403-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1417+
for (int i = 0; i < num_core_entries(); i++) {
14041418
/* instructions - sampling group leader */
14051419
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
14061420
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1437,9 +1451,9 @@ static int test__checkevent_pinned_modifier(struct evlist *evlist)
14371451
struct evsel *evsel = NULL;
14381452

14391453
TEST_ASSERT_VAL("wrong number of entries",
1440-
evlist->core.nr_entries == perf_pmus__num_core_pmus());
1454+
evlist->core.nr_entries == num_core_entries());
14411455

1442-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1456+
for (int i = 0; i < num_core_entries(); i++) {
14431457
evsel = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
14441458
TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
14451459
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
@@ -1455,9 +1469,9 @@ static int test__pinned_group(struct evlist *evlist)
14551469
struct evsel *evsel = NULL, *leader;
14561470

14571471
TEST_ASSERT_VAL("wrong number of entries",
1458-
evlist->core.nr_entries == (3 * perf_pmus__num_core_pmus()));
1472+
evlist->core.nr_entries == (3 * num_core_entries()));
14591473

1460-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1474+
for (int i = 0; i < num_core_entries(); i++) {
14611475
/* cycles - group leader */
14621476
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
14631477
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1500,9 +1514,9 @@ static int test__exclusive_group(struct evlist *evlist)
15001514
struct evsel *evsel = NULL, *leader;
15011515

15021516
TEST_ASSERT_VAL("wrong number of entries",
1503-
evlist->core.nr_entries == (3 * perf_pmus__num_core_pmus()));
1517+
evlist->core.nr_entries == 3 * num_core_entries());
15041518

1505-
for (int i = 0; i < perf_pmus__num_core_pmus(); i++) {
1519+
for (int i = 0; i < num_core_entries(); i++) {
15061520
/* cycles - group leader */
15071521
evsel = leader = (i == 0 ? evlist__first(evlist) : evsel__next(evsel));
15081522
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
@@ -1574,7 +1588,7 @@ static int test__checkevent_precise_max_modifier(struct evlist *evlist)
15741588
struct evsel *evsel = evlist__first(evlist);
15751589

15761590
TEST_ASSERT_VAL("wrong number of entries",
1577-
evlist->core.nr_entries == (1 + perf_pmus__num_core_pmus()));
1591+
evlist->core.nr_entries == 1 + num_core_entries());
15781592
TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->core.attr.type);
15791593
TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_SW_TASK_CLOCK));
15801594
return TEST_OK;

0 commit comments

Comments
 (0)