mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-07 13:13:57 +08:00
perf test: Fix parse-events tests for >1 core PMU
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>
This commit is contained in:
parent
003be8c4f7
commit
aefde50a44
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user