LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: John Garry <john.garry@huawei.com>
To: <peterz@infradead.org>, <mingo@redhat.com>, <acme@kernel.org>,
<mark.rutland@arm.com>, <alexander.shishkin@linux.intel.com>,
<jolsa@redhat.com>, <namhyung@kernel.org>
Cc: <will@kernel.org>, <ak@linux.intel.com>, <linuxarm@huawei.com>,
<linux-kernel@vger.kernel.org>, <james.clark@arm.com>,
<qiangqing.zhang@nxp.com>, John Garry <john.garry@huawei.com>
Subject: [PATCH 6/6] perf test: Add pmu-events test
Date: Thu, 5 Mar 2020 19:08:06 +0800 [thread overview]
Message-ID: <1583406486-154841-7-git-send-email-john.garry@huawei.com> (raw)
In-Reply-To: <1583406486-154841-1-git-send-email-john.garry@huawei.com>
Add a pmu-events test.
This test will scan all PMUs in the system, and run a PMU event aliasing
test for each CPU or uncore PMU.
For known aliases added in pmu-events/arch/test, we need to add an entry
in test_cpu_aliases[] or test_uncore_aliases[].
A sample run is as follows for x86:
Couldn't bump rlimit(MEMLOCK), failures may take place when creating BPF maps, etc
10: PMU event aliases :
--- start ---
test child forked, pid 30869
Using CPUID GenuineIntel-6-9E-9
intel_pt default config: tsc,mtc,mtc_period=3,psb_period=3,pt,branch
skipping testing PMU software
testing PMU power: skip
testing PMU cpu: matched event segment_reg_loads.any
testing PMU cpu: matched event dispatch_blocked.any
testing PMU cpu: matched event eist_trans
testing PMU cpu: matched event bp_l1_btb_correct
testing PMU cpu: matched event bp_l2_btb_correct
testing PMU cpu: pass
testing PMU cstate_core: skip
testing PMU uncore_cbox_2: matched event unc_cbo_xsnp_response.miss_eviction
testing PMU uncore_cbox_2: pass
skipping testing PMU breakpoint
testing PMU uncore_cbox_0: matched event unc_cbo_xsnp_response.miss_eviction
testing PMU uncore_cbox_0: pass
skipping testing PMU tracepoint
testing PMU cstate_pkg: skip
testing PMU uncore_arb: skip
testing PMU msr: skip
testing PMU uncore_cbox_3: matched event unc_cbo_xsnp_response.miss_eviction
testing PMU uncore_cbox_3: pass
testing PMU intel_pt: skip
testing PMU uncore_cbox_1: matched event unc_cbo_xsnp_response.miss_eviction
testing PMU uncore_cbox_1: pass
test child finished with 0
---- end ----
PMU event aliases: Ok
Signed-off-by: John Garry <john.garry@huawei.com>
---
tools/perf/tests/Build | 1 +
tools/perf/tests/builtin-test.c | 4 +
tools/perf/tests/pmu-events.c | 192 ++++++++++++++++++++++++++++++++
tools/perf/tests/tests.h | 1 +
4 files changed, 198 insertions(+)
create mode 100644 tools/perf/tests/pmu-events.c
diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
index 1692529639b0..b3d1bf13ca07 100644
--- a/tools/perf/tests/Build
+++ b/tools/perf/tests/Build
@@ -14,6 +14,7 @@ perf-y += evsel-roundtrip-name.o
perf-y += evsel-tp-sched.o
perf-y += fdarray.o
perf-y += pmu.o
+perf-y += pmu-events.o
perf-y += hists_common.o
perf-y += hists_link.o
perf-y += hists_filter.o
diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 5f05db75cdd8..e8f56740d14a 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -72,6 +72,10 @@ static struct test generic_tests[] = {
.desc = "Parse perf pmu format",
.func = test__pmu,
},
+ {
+ .desc = "PMU event aliases",
+ .func = test__pmu_event_aliases,
+ },
{
.desc = "DSO data read",
.func = test__dso_data,
diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c
new file mode 100644
index 000000000000..176b80666b5e
--- /dev/null
+++ b/tools/perf/tests/pmu-events.c
@@ -0,0 +1,192 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "parse-events.h"
+#include "pmu.h"
+#include "tests.h"
+#include <errno.h>
+#include <stdio.h>
+#include <linux/kernel.h>
+
+#include <linux/zalloc.h>
+
+#include "debug.h"
+#include "../pmu-events/pmu-events.h"
+
+static struct perf_pmu_alias test_cpu_aliases[] = {
+ {
+ .name = (char *)"segment_reg_loads.any",
+ .str = (char *)"umask=0x80,(null)=0x30d40,event=0x6",
+ .desc = (char *)"Number of segment register loads",
+ .topic = (char *)"other",
+
+ },
+ {
+ .name = (char *)"dispatch_blocked.any",
+ .str = (char *)"umask=0x20,(null)=0x30d40,event=0x9",
+ .desc = (char *)"Memory cluster signals to block micro-op dispatch for any reason",
+ .topic = (char *)"other",
+
+ },
+ {
+ .name = (char *)"eist_trans",
+ .str = (char *)"umask=0,(null)=0x30d40,event=0x3a",
+ .desc = (char *)"Number of Enhanced Intel SpeedStep(R) Technology (EIST) transitions",
+ .topic = (char *)"other",
+
+ },
+ {
+ .name = (char *)"bp_l1_btb_correct",
+ .str = (char *)"event=0x8a",
+ .desc = (char *)"L1 BTB Correction",
+ .topic = (char *)"branch",
+
+ },
+ {
+ .name = (char *)"bp_l2_btb_correct",
+ .str = (char *)"event=0x8b",
+ .desc = (char *)"L2 BTB Correction",
+ .topic = (char *)"branch",
+
+ },
+ { /* sentinel */
+ }
+};
+
+static struct perf_pmu_alias test_uncore_aliases[] = {
+ {
+ .name = (char *)"uncore_hisi_ddrc.flux_wcmd",
+ .str = (char *)"event=0x2",
+ .desc = (char *)"DDRC write commands. Unit: hisi_sccl,ddrc ",
+ .topic = (char *)"uncore",
+
+ },
+ {
+ .name = (char *)"unc_cbo_xsnp_response.miss_eviction",
+ .str = (char *)"umask=0x81,event=0x22",
+ .desc = (char *)"Unit: uncore_cbox A cross-core snoop resulted from L3 Eviction which misses in some processor core",
+ .long_desc = (char *)"A cross-core snoop resulted from L3 Eviction which misses in some processor core",
+ .topic = (char *)"uncore",
+
+ },
+ { /* sentinel */
+ }
+
+};
+
+static bool is_same(char *reference, char *test)
+{
+ if (!test)
+ return false;
+
+ return !strcmp(reference, test);
+}
+
+static struct perf_pmu_alias *find_alias(char *pmu_name, char *alias_name)
+{
+ struct perf_pmu_alias *alias;
+
+ if (is_pmu_core(pmu_name))
+ alias = &test_cpu_aliases[0];
+ else
+ alias = &test_uncore_aliases[0];
+
+ for (; alias->name; alias++)
+ if (!strcmp(alias_name, alias->name))
+ return alias;
+
+ return NULL;
+}
+
+static int __test__pmu_event_aliases(char *pmu_name, int *count)
+{
+ struct perf_pmu_alias *alias;
+ struct perf_pmu *pmu;
+ LIST_HEAD(aliases);
+ int res = 0;
+
+ pmu = zalloc(sizeof(*pmu));
+ if (!pmu)
+ return -1;
+
+ pmu->name = pmu_name;
+
+ pmu_add_cpu_aliases_map(&aliases, pmu, &pmu_events_map_test);
+
+ list_for_each_entry(alias, &aliases, list) {
+ struct perf_pmu_alias *test_alias;
+
+ test_alias = find_alias(pmu_name, alias->name);
+
+ if (!test_alias) {
+ pr_debug2("no alias for PMU %s\n", pmu_name);
+ res = -1;
+ break;
+ }
+
+ if (test_alias->desc &&
+ !is_same(test_alias->desc, alias->desc)) {
+ pr_debug2("mismatched desc for PMU %s, %s vs %s\n",
+ pmu_name, test_alias->desc, alias->desc);
+ res = -1;
+ break;
+ }
+
+ if (test_alias->long_desc &&
+ !is_same(test_alias->long_desc, alias->long_desc)) {
+ pr_debug2("mismatched long_desc for PMU %s, %s vs %s\n",
+ pmu_name, test_alias->long_desc,
+ alias->long_desc);
+ res = -1;
+ break;
+ }
+
+ if (test_alias->str && !is_same(test_alias->str, alias->str)) {
+ pr_debug2("mismatched str for PMU %s, %s vs %s\n",
+ pmu_name, test_alias->str, alias->str);
+ res = -1;
+ break;
+ }
+
+ if (test_alias->topic &&
+ !is_same(test_alias->topic, alias->topic)) {
+ pr_debug2("mismatched topic for PMU %s, %s vs %s\n",
+ pmu_name, test_alias->topic, alias->topic);
+ res = -1;
+ break;
+ }
+
+ (*count)++;
+
+ pr_debug2("testing PMU %s: matched event %s\n",
+ pmu_name, test_alias->name);
+ }
+
+ free(pmu);
+ return res;
+}
+
+int test__pmu_event_aliases(struct test *test __maybe_unused,
+ int subtest __maybe_unused)
+{
+ struct perf_pmu *pmu = NULL;
+
+ while ((pmu = perf_pmu__scan(pmu)) != NULL) {
+ int count = 0;
+
+ if (list_empty(&pmu->format)) {
+ pr_debug2("skipping testing PMU %s\n", pmu->name);
+ continue;
+ }
+
+ if (__test__pmu_event_aliases(pmu->name, &count)) {
+ pr_debug("testing PMU %s: failed\n", pmu->name);
+ return -1;
+ }
+
+ if (count == 0)
+ pr_debug("testing PMU %s: skip\n", pmu->name);
+ else
+ pr_debug("testing PMU %s: pass\n", pmu->name);
+ }
+
+ return 0;
+}
diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
index 9a160fef47c9..a7ca3bb1c9cd 100644
--- a/tools/perf/tests/tests.h
+++ b/tools/perf/tests/tests.h
@@ -49,6 +49,7 @@ int test__perf_evsel__roundtrip_name_test(struct test *test, int subtest);
int test__perf_evsel__tp_sched_test(struct test *test, int subtest);
int test__syscall_openat_tp_fields(struct test *test, int subtest);
int test__pmu(struct test *test, int subtest);
+int test__pmu_event_aliases(struct test *test, int subtest);
int test__attr(struct test *test, int subtest);
int test__dso_data(struct test *test, int subtest);
int test__dso_data_cache(struct test *test, int subtest);
--
2.17.1
next prev parent reply other threads:[~2020-03-05 11:12 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-05 11:08 [PATCH 0/6] perf test pmu-events case John Garry
2020-03-05 11:08 ` [PATCH 1/6] perf jevents: Fix leak of mapfile memory John Garry
2020-03-05 15:13 ` Arnaldo Carvalho de Melo
2020-03-07 7:36 ` [tip: perf/urgent] " tip-bot2 for John Garry
2020-03-05 11:08 ` [PATCH 2/6] perf jevents: Support test events folder John Garry
2020-03-05 11:08 ` [PATCH 3/6] perf jevents: Add some test events John Garry
2020-03-05 11:08 ` [PATCH 4/6] perf pmu: Refactor pmu_add_cpu_aliases() John Garry
2020-03-05 11:08 ` [PATCH 5/6] perf pmu: Add is_pmu_core() John Garry
2020-03-05 11:08 ` John Garry [this message]
2020-03-09 8:49 ` [PATCH 6/6] perf test: Add pmu-events test Jiri Olsa
2020-03-09 10:12 ` John Garry
2020-03-09 15:26 ` Jiri Olsa
2020-03-09 16:20 ` John Garry
2020-03-13 10:32 ` Jiri Olsa
2020-03-13 11:08 ` John Garry
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1583406486-154841-7-git-send-email-john.garry@huawei.com \
--to=john.garry@huawei.com \
--cc=acme@kernel.org \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=james.clark@arm.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=qiangqing.zhang@nxp.com \
--cc=will@kernel.org \
--subject='Re: [PATCH 6/6] perf test: Add pmu-events test' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).