perf test: Fix parse-events tests for >1 core PMU
authorIan Rogers <irogers@google.com>
Tue, 2 May 2023 22:38:39 +0000 (15:38 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 15 May 2023 12:12:14 +0000 (09:12 -0300)
Remove assumptions of just 1 core PMU.

Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Kan Liang <kan.liang@linux.intel.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ahmad Yasin <ahmad.yasin@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Caleb Biggers <caleb.biggers@intel.com>
Cc: Edward Baker <edward.baker@intel.com>
Cc: Florian Fischer <florian.fischer@muhq.space>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kang Minchul <tegongkang@gmail.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Perry Taylor <perry.taylor@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Rob Herring <robh@kernel.org>
Cc: Samantha Alt <samantha.alt@intel.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Tiezhu Yang <yangtiezhu@loongson.cn>
Cc: Weilin Wang <weilin.wang@intel.com>
Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com>
Cc: Yang Jihong <yangjihong1@huawei.com>
Link: https://lore.kernel.org/r/20230502223851.2234828-33-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/parse-events.c

index 0d0c869..71c77d9 100644 (file)
@@ -35,6 +35,11 @@ static bool test_config(const struct evsel *evsel, __u64 expected_config)
        return config == expected_config;
 }
 
+static bool test_perf_config(const struct perf_evsel *evsel, __u64 expected_config)
+{
+       return (evsel->attr.config & PERF_HW_EVENT_MASK) == expected_config;
+}
+
 #ifdef HAVE_LIBTRACEEVENT
 
 #if defined(__s390x__)
@@ -97,11 +102,27 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist)
 
 static int test__checkevent_raw(struct evlist *evlist)
 {
-       struct evsel *evsel = evlist__first(evlist);
+       struct perf_evsel *evsel;
+       bool raw_type_match = false;
 
-       TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
-       TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
-       TEST_ASSERT_VAL("wrong config", test_config(evsel, 0x1a));
+       TEST_ASSERT_VAL("wrong number of entries", 0 != evlist->core.nr_entries);
+
+       perf_evlist__for_each_evsel(&evlist->core, evsel) {
+               struct perf_pmu *pmu;
+               bool type_matched = false;
+
+               TEST_ASSERT_VAL("wrong config", test_perf_config(evsel, 0x1a));
+               perf_pmus__for_each_pmu(pmu) {
+                       if (pmu->type == evsel->attr.type) {
+                               TEST_ASSERT_VAL("PMU type expected once", !type_matched);
+                               type_matched = true;
+                               if (pmu->type == PERF_TYPE_RAW)
+                                       raw_type_match = true;
+                       }
+               }
+               TEST_ASSERT_VAL("No PMU found for type", type_matched);
+       }
+       TEST_ASSERT_VAL("Raw PMU not matched", raw_type_match);
        return TEST_OK;
 }
 
@@ -117,31 +138,35 @@ static int test__checkevent_numeric(struct evlist *evlist)
 
 static int test__checkevent_symbolic_name(struct evlist *evlist)
 {
-       struct evsel *evsel = evlist__first(evlist);
+       struct perf_evsel *evsel;
 
-       TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
-       TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
-       TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_HW_INSTRUCTIONS));
+       TEST_ASSERT_VAL("wrong number of entries", 0 != evlist->core.nr_entries);
+
+       perf_evlist__for_each_evsel(&evlist->core, evsel) {
+               TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
+               TEST_ASSERT_VAL("wrong config",
+                               test_perf_config(evsel, PERF_COUNT_HW_INSTRUCTIONS));
+       }
        return TEST_OK;
 }
 
 static int test__checkevent_symbolic_name_config(struct evlist *evlist)
 {
-       struct evsel *evsel = evlist__first(evlist);
+       struct perf_evsel *evsel;
 
-       TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
-       TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
-       TEST_ASSERT_VAL("wrong config", test_config(evsel, PERF_COUNT_HW_CPU_CYCLES));
-       /*
-        * The period value gets configured within evlist__config,
-        * while this test executes only parse events method.
-        */
-       TEST_ASSERT_VAL("wrong period",
-                       0 == evsel->core.attr.sample_period);
-       TEST_ASSERT_VAL("wrong config1",
-                       0 == evsel->core.attr.config1);
-       TEST_ASSERT_VAL("wrong config2",
-                       1 == evsel->core.attr.config2);
+       TEST_ASSERT_VAL("wrong number of entries", 0 != evlist->core.nr_entries);
+
+       perf_evlist__for_each_evsel(&evlist->core, evsel) {
+               TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
+               TEST_ASSERT_VAL("wrong config", test_perf_config(evsel, PERF_COUNT_HW_CPU_CYCLES));
+               /*
+                * The period value gets configured within evlist__config,
+                * while this test executes only parse events method.
+                */
+               TEST_ASSERT_VAL("wrong period", 0 == evsel->attr.sample_period);
+               TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
+               TEST_ASSERT_VAL("wrong config2", 1 == evsel->attr.config2);
+       }
        return TEST_OK;
 }
 
@@ -157,11 +182,14 @@ static int test__checkevent_symbolic_alias(struct evlist *evlist)
 
 static int test__checkevent_genhw(struct evlist *evlist)
 {
-       struct evsel *evsel = evlist__first(evlist);
+       struct perf_evsel *evsel;
 
-       TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
-       TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->core.attr.type);
-       TEST_ASSERT_VAL("wrong config", test_config(evsel, 1 << 16));
+       TEST_ASSERT_VAL("wrong number of entries", 0 != evlist->core.nr_entries);
+
+       perf_evlist__for_each_entry(&evlist->core, evsel) {
+               TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
+               TEST_ASSERT_VAL("wrong config", test_perf_config(evsel, 1 << 16));
+       }
        return TEST_OK;
 }
 
@@ -253,17 +281,15 @@ static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
 static int
 test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
 {
-       struct evsel *evsel;
+       struct perf_evsel *evsel;
 
        TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
 
-       evlist__for_each_entry(evlist, evsel) {
-               TEST_ASSERT_VAL("wrong exclude_user",
-                               !evsel->core.attr.exclude_user);
-               TEST_ASSERT_VAL("wrong exclude_kernel",
-                               evsel->core.attr.exclude_kernel);
-               TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
-               TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
+       perf_evlist__for_each_entry(&evlist->core, evsel) {
+               TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
+               TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
+               TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
+               TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
        }
 
        return test__checkevent_tracepoint_multi(evlist);
@@ -272,25 +298,27 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
 
 static int test__checkevent_raw_modifier(struct evlist *evlist)
 {
-       struct evsel *evsel = evlist__first(evlist);
-
-       TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
-       TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
-       TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
-       TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
+       struct perf_evsel *evsel;
 
+       perf_evlist__for_each_entry(&evlist->core, evsel) {
+               TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
+               TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
+               TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
+               TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
+       }
        return test__checkevent_raw(evlist);
 }
 
 static int test__checkevent_numeric_modifier(struct evlist *evlist)
 {
-       struct evsel *evsel = evlist__first(evlist);
-
-       TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
-       TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
-       TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
-       TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
+       struct perf_evsel *evsel;
 
+       perf_evlist__for_each_entry(&evlist->core, evsel) {
+               TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
+               TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
+               TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
+               TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
+       }
        return test__checkevent_numeric(evlist);
 }
 
@@ -308,21 +336,23 @@ static int test__checkevent_symbolic_name_modifier(struct evlist *evlist)
 
 static int test__checkevent_exclude_host_modifier(struct evlist *evlist)
 {
-       struct evsel *evsel = evlist__first(evlist);
-
-       TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
-       TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
+       struct perf_evsel *evsel;
 
+       perf_evlist__for_each_entry(&evlist->core, evsel) {
+               TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
+               TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
+       }
        return test__checkevent_symbolic_name(evlist);
 }
 
 static int test__checkevent_exclude_guest_modifier(struct evlist *evlist)
 {
-       struct evsel *evsel = evlist__first(evlist);
-
-       TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
-       TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
+       struct perf_evsel *evsel;
 
+       perf_evlist__for_each_entry(&evlist->core, evsel) {
+               TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
+               TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
+       }
        return test__checkevent_symbolic_name(evlist);
 }
 
@@ -340,13 +370,14 @@ static int test__checkevent_symbolic_alias_modifier(struct evlist *evlist)
 
 static int test__checkevent_genhw_modifier(struct evlist *evlist)
 {
-       struct evsel *evsel = evlist__first(evlist);
-
-       TEST_ASSERT_VAL("wrong exclude_user", evsel->core.attr.exclude_user);
-       TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
-       TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
-       TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
+       struct perf_evsel *evsel;
 
+       perf_evlist__for_each_entry(&evlist->core, evsel) {
+               TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
+               TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
+               TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
+               TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
+       }
        return test__checkevent_genhw(evlist);
 }
 
@@ -476,21 +507,23 @@ static int test__checkevent_list(struct evlist *evlist)
 {
        struct evsel *evsel = evlist__first(evlist);
 
-       TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
+       TEST_ASSERT_VAL("wrong number of entries", 3 <= evlist->core.nr_entries);
 
        /* r1 */
-       TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type);
-       TEST_ASSERT_VAL("wrong config", test_config(evsel, 1));
-       TEST_ASSERT_VAL("wrong config1", 0 == evsel->core.attr.config1);
-       TEST_ASSERT_VAL("wrong config2", 0 == evsel->core.attr.config2);
-       TEST_ASSERT_VAL("wrong config3", 0 == evsel->core.attr.config3);
-       TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
-       TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
-       TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
-       TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
+       TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT != evsel->core.attr.type);
+       while (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) {
+               TEST_ASSERT_VAL("wrong config", test_config(evsel, 1));
+               TEST_ASSERT_VAL("wrong config1", 0 == evsel->core.attr.config1);
+               TEST_ASSERT_VAL("wrong config2", 0 == evsel->core.attr.config2);
+               TEST_ASSERT_VAL("wrong config3", 0 == evsel->core.attr.config3);
+               TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
+               TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
+               TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv);
+               TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
+               evsel = evsel__next(evsel);
+       }
 
        /* syscalls:sys_enter_openat:k */
-       evsel = evsel__next(evsel);
        TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
        TEST_ASSERT_VAL("wrong sample_type",
                PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
@@ -1930,7 +1963,7 @@ static int test_event(const struct evlist_test *e)
                         e->name, ret, err.str);
                parse_events_error__print(&err, e->name);
                ret = TEST_FAIL;
-               if (strstr(err.str, "can't access trace events"))
+               if (err.str && strstr(err.str, "can't access trace events"))
                        ret = TEST_SKIP;
        } else {
                ret = e->check(evlist);