Commit aefde50a authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo

perf test: Fix parse-events tests for >1 core PMU

Remove assumptions of just 1 core PMU.
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Tested-by: default avatarKan 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 003be8c4
...@@ -35,6 +35,11 @@ static bool test_config(const struct evsel *evsel, __u64 expected_config) ...@@ -35,6 +35,11 @@ static bool test_config(const struct evsel *evsel, __u64 expected_config)
return config == 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 #ifdef HAVE_LIBTRACEEVENT
#if defined(__s390x__) #if defined(__s390x__)
...@@ -97,11 +102,27 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist) ...@@ -97,11 +102,27 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist)
static int test__checkevent_raw(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 number of entries", 0 != 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)); 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; return TEST_OK;
} }
...@@ -117,31 +138,35 @@ static int test__checkevent_numeric(struct evlist *evlist) ...@@ -117,31 +138,35 @@ static int test__checkevent_numeric(struct evlist *evlist)
static int test__checkevent_symbolic_name(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 number of entries", 0 != 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)); 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; return TEST_OK;
} }
static int test__checkevent_symbolic_name_config(struct evlist *evlist) 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 number of entries", 0 != 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)); perf_evlist__for_each_evsel(&evlist->core, evsel) {
/* TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
* The period value gets configured within evlist__config, TEST_ASSERT_VAL("wrong config", test_perf_config(evsel, PERF_COUNT_HW_CPU_CYCLES));
* while this test executes only parse events method. /*
*/ * The period value gets configured within evlist__config,
TEST_ASSERT_VAL("wrong period", * while this test executes only parse events method.
0 == evsel->core.attr.sample_period); */
TEST_ASSERT_VAL("wrong config1", TEST_ASSERT_VAL("wrong period", 0 == evsel->attr.sample_period);
0 == evsel->core.attr.config1); TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
TEST_ASSERT_VAL("wrong config2", TEST_ASSERT_VAL("wrong config2", 1 == evsel->attr.config2);
1 == evsel->core.attr.config2); }
return TEST_OK; return TEST_OK;
} }
...@@ -157,11 +182,14 @@ static int test__checkevent_symbolic_alias(struct evlist *evlist) ...@@ -157,11 +182,14 @@ static int test__checkevent_symbolic_alias(struct evlist *evlist)
static int test__checkevent_genhw(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 number of entries", 0 != 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)); 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; return TEST_OK;
} }
...@@ -253,17 +281,15 @@ static int test__checkevent_tracepoint_modifier(struct evlist *evlist) ...@@ -253,17 +281,15 @@ static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
static int static int
test__checkevent_tracepoint_multi_modifier(struct evlist *evlist) 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); TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
evlist__for_each_entry(evlist, evsel) { perf_evlist__for_each_entry(&evlist->core, evsel) {
TEST_ASSERT_VAL("wrong exclude_user", TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
!evsel->core.attr.exclude_user); TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
TEST_ASSERT_VAL("wrong exclude_kernel", TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
} }
return test__checkevent_tracepoint_multi(evlist); return test__checkevent_tracepoint_multi(evlist);
...@@ -272,25 +298,27 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist) ...@@ -272,25 +298,27 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
static int test__checkevent_raw_modifier(struct evlist *evlist) static int test__checkevent_raw_modifier(struct evlist *evlist)
{ {
struct evsel *evsel = evlist__first(evlist); struct perf_evsel *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_raw(evlist); return test__checkevent_raw(evlist);
} }
static int test__checkevent_numeric_modifier(struct evlist *evlist) static int test__checkevent_numeric_modifier(struct evlist *evlist)
{ {
struct evsel *evsel = evlist__first(evlist); struct perf_evsel *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_numeric(evlist); return test__checkevent_numeric(evlist);
} }
...@@ -308,21 +336,23 @@ static int test__checkevent_symbolic_name_modifier(struct evlist *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) static int test__checkevent_exclude_host_modifier(struct evlist *evlist)
{ {
struct evsel *evsel = evlist__first(evlist); struct perf_evsel *evsel;
TEST_ASSERT_VAL("wrong exclude guest", !evsel->core.attr.exclude_guest);
TEST_ASSERT_VAL("wrong exclude host", evsel->core.attr.exclude_host);
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); return test__checkevent_symbolic_name(evlist);
} }
static int test__checkevent_exclude_guest_modifier(struct evlist *evlist) static int test__checkevent_exclude_guest_modifier(struct evlist *evlist)
{ {
struct evsel *evsel = evlist__first(evlist); struct perf_evsel *evsel;
TEST_ASSERT_VAL("wrong exclude guest", evsel->core.attr.exclude_guest);
TEST_ASSERT_VAL("wrong exclude host", !evsel->core.attr.exclude_host);
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); return test__checkevent_symbolic_name(evlist);
} }
...@@ -340,13 +370,14 @@ static int test__checkevent_symbolic_alias_modifier(struct evlist *evlist) ...@@ -340,13 +370,14 @@ static int test__checkevent_symbolic_alias_modifier(struct evlist *evlist)
static int test__checkevent_genhw_modifier(struct evlist *evlist) static int test__checkevent_genhw_modifier(struct evlist *evlist)
{ {
struct evsel *evsel = evlist__first(evlist); struct perf_evsel *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_genhw(evlist); return test__checkevent_genhw(evlist);
} }
...@@ -476,21 +507,23 @@ static int test__checkevent_list(struct evlist *evlist) ...@@ -476,21 +507,23 @@ static int test__checkevent_list(struct evlist *evlist)
{ {
struct evsel *evsel = evlist__first(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 */ /* r1 */
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT != evsel->core.attr.type);
TEST_ASSERT_VAL("wrong config", test_config(evsel, 1)); while (evsel->core.attr.type != PERF_TYPE_TRACEPOINT) {
TEST_ASSERT_VAL("wrong config1", 0 == evsel->core.attr.config1); TEST_ASSERT_VAL("wrong config", test_config(evsel, 1));
TEST_ASSERT_VAL("wrong config2", 0 == evsel->core.attr.config2); TEST_ASSERT_VAL("wrong config1", 0 == evsel->core.attr.config1);
TEST_ASSERT_VAL("wrong config3", 0 == evsel->core.attr.config3); TEST_ASSERT_VAL("wrong config2", 0 == evsel->core.attr.config2);
TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user); TEST_ASSERT_VAL("wrong config3", 0 == evsel->core.attr.config3);
TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel);
TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); 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 */ /* 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 type", PERF_TYPE_TRACEPOINT == evsel->core.attr.type);
TEST_ASSERT_VAL("wrong sample_type", TEST_ASSERT_VAL("wrong sample_type",
PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type); PERF_TP_SAMPLE_TYPE == evsel->core.attr.sample_type);
...@@ -1930,7 +1963,7 @@ static int test_event(const struct evlist_test *e) ...@@ -1930,7 +1963,7 @@ static int test_event(const struct evlist_test *e)
e->name, ret, err.str); e->name, ret, err.str);
parse_events_error__print(&err, e->name); parse_events_error__print(&err, e->name);
ret = TEST_FAIL; 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; ret = TEST_SKIP;
} else { } else {
ret = e->check(evlist); ret = e->check(evlist);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment