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

perf jevents: Use "default_core" for events with no Unit

The JSON Unit field encodes the name of the PMU to match the events
to. When no name is given it has meant the "cpu" core PMU except for
tests.

On ARM, Intel hybrid and s390 the core PMU is named differently which
means that using "cpu" for this case causes the events not to get
matched to the PMU.

Introduce a new "default_core" string for this case and in the
pmu__name_match force all core PMUs to match this name.

Fixes: 2e255b4f ("perf jevents: Group events by PMU")
Reported-by: default avatarArnaldo Carvalho de Melo <acme@kernel.org>
Reported-by: default avatarThomas Richter <tmricht@linux.ibm.com>
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jing Zhang <renyu.zj@linux.alibaba.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20230826062203.1058041-1-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent a84260e3
...@@ -266,7 +266,7 @@ class JsonEvent: ...@@ -266,7 +266,7 @@ class JsonEvent:
def unit_to_pmu(unit: str) -> Optional[str]: def unit_to_pmu(unit: str) -> Optional[str]:
"""Convert a JSON Unit to Linux PMU name.""" """Convert a JSON Unit to Linux PMU name."""
if not unit: if not unit:
return 'cpu' return 'default_core'
# Comment brought over from jevents.c: # Comment brought over from jevents.c:
# it's not realistic to keep adding these, we need something more scalable ... # it's not realistic to keep adding these, we need something more scalable ...
table = { table = {
......
...@@ -44,7 +44,7 @@ struct perf_pmu_test_pmu { ...@@ -44,7 +44,7 @@ struct perf_pmu_test_pmu {
static const struct perf_pmu_test_event bp_l1_btb_correct = { static const struct perf_pmu_test_event bp_l1_btb_correct = {
.event = { .event = {
.pmu = "cpu", .pmu = "default_core",
.name = "bp_l1_btb_correct", .name = "bp_l1_btb_correct",
.event = "event=0x8a", .event = "event=0x8a",
.desc = "L1 BTB Correction", .desc = "L1 BTB Correction",
...@@ -56,7 +56,7 @@ static const struct perf_pmu_test_event bp_l1_btb_correct = { ...@@ -56,7 +56,7 @@ static const struct perf_pmu_test_event bp_l1_btb_correct = {
static const struct perf_pmu_test_event bp_l2_btb_correct = { static const struct perf_pmu_test_event bp_l2_btb_correct = {
.event = { .event = {
.pmu = "cpu", .pmu = "default_core",
.name = "bp_l2_btb_correct", .name = "bp_l2_btb_correct",
.event = "event=0x8b", .event = "event=0x8b",
.desc = "L2 BTB Correction", .desc = "L2 BTB Correction",
...@@ -68,7 +68,7 @@ static const struct perf_pmu_test_event bp_l2_btb_correct = { ...@@ -68,7 +68,7 @@ static const struct perf_pmu_test_event bp_l2_btb_correct = {
static const struct perf_pmu_test_event segment_reg_loads_any = { static const struct perf_pmu_test_event segment_reg_loads_any = {
.event = { .event = {
.pmu = "cpu", .pmu = "default_core",
.name = "segment_reg_loads.any", .name = "segment_reg_loads.any",
.event = "event=0x6,period=200000,umask=0x80", .event = "event=0x6,period=200000,umask=0x80",
.desc = "Number of segment register loads", .desc = "Number of segment register loads",
...@@ -80,7 +80,7 @@ static const struct perf_pmu_test_event segment_reg_loads_any = { ...@@ -80,7 +80,7 @@ static const struct perf_pmu_test_event segment_reg_loads_any = {
static const struct perf_pmu_test_event dispatch_blocked_any = { static const struct perf_pmu_test_event dispatch_blocked_any = {
.event = { .event = {
.pmu = "cpu", .pmu = "default_core",
.name = "dispatch_blocked.any", .name = "dispatch_blocked.any",
.event = "event=0x9,period=200000,umask=0x20", .event = "event=0x9,period=200000,umask=0x20",
.desc = "Memory cluster signals to block micro-op dispatch for any reason", .desc = "Memory cluster signals to block micro-op dispatch for any reason",
...@@ -92,7 +92,7 @@ static const struct perf_pmu_test_event dispatch_blocked_any = { ...@@ -92,7 +92,7 @@ static const struct perf_pmu_test_event dispatch_blocked_any = {
static const struct perf_pmu_test_event eist_trans = { static const struct perf_pmu_test_event eist_trans = {
.event = { .event = {
.pmu = "cpu", .pmu = "default_core",
.name = "eist_trans", .name = "eist_trans",
.event = "event=0x3a,period=200000,umask=0x0", .event = "event=0x3a,period=200000,umask=0x0",
.desc = "Number of Enhanced Intel SpeedStep(R) Technology (EIST) transitions", .desc = "Number of Enhanced Intel SpeedStep(R) Technology (EIST) transitions",
...@@ -104,7 +104,7 @@ static const struct perf_pmu_test_event eist_trans = { ...@@ -104,7 +104,7 @@ static const struct perf_pmu_test_event eist_trans = {
static const struct perf_pmu_test_event l3_cache_rd = { static const struct perf_pmu_test_event l3_cache_rd = {
.event = { .event = {
.pmu = "cpu", .pmu = "default_core",
.name = "l3_cache_rd", .name = "l3_cache_rd",
.event = "event=0x40", .event = "event=0x40",
.desc = "L3 cache access, read", .desc = "L3 cache access, read",
...@@ -391,8 +391,8 @@ static int compare_alias_to_test_event(struct pmu_event_info *alias, ...@@ -391,8 +391,8 @@ static int compare_alias_to_test_event(struct pmu_event_info *alias,
return -1; return -1;
} }
if (!is_same(alias->pmu_name, test_event->event.pmu) &&
if (!is_same(alias->pmu_name, test_event->event.pmu)) { !is_same(alias->pmu_name, "default_core")) {
pr_debug("testing aliases PMU %s: mismatched pmu_name, %s vs %s\n", pr_debug("testing aliases PMU %s: mismatched pmu_name, %s vs %s\n",
pmu_name, alias->pmu_name, test_event->event.pmu); pmu_name, alias->pmu_name, test_event->event.pmu);
return -1; return -1;
...@@ -409,7 +409,7 @@ static int test__pmu_event_table_core_callback(const struct pmu_event *pe, ...@@ -409,7 +409,7 @@ static int test__pmu_event_table_core_callback(const struct pmu_event *pe,
struct perf_pmu_test_event const **test_event_table; struct perf_pmu_test_event const **test_event_table;
bool found = false; bool found = false;
if (strcmp(pe->pmu, "cpu")) if (strcmp(pe->pmu, "default_core"))
test_event_table = &uncore_events[0]; test_event_table = &uncore_events[0];
else else
test_event_table = &core_events[0]; test_event_table = &core_events[0];
...@@ -543,6 +543,7 @@ static int __test_core_pmu_event_aliases(const char *pmu_name, int *count) ...@@ -543,6 +543,7 @@ static int __test_core_pmu_event_aliases(const char *pmu_name, int *count)
INIT_LIST_HEAD(&pmu->caps); INIT_LIST_HEAD(&pmu->caps);
INIT_LIST_HEAD(&pmu->list); INIT_LIST_HEAD(&pmu->list);
pmu->name = strdup(pmu_name); pmu->name = strdup(pmu_name);
pmu->is_core = true;
pmu->events_table = table; pmu->events_table = table;
pmu_add_cpu_aliases_table(pmu, table); pmu_add_cpu_aliases_table(pmu, table);
......
...@@ -1747,7 +1747,12 @@ int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus, ...@@ -1747,7 +1747,12 @@ int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,
bool pmu__name_match(const struct perf_pmu *pmu, const char *pmu_name) bool pmu__name_match(const struct perf_pmu *pmu, const char *pmu_name)
{ {
return !strcmp(pmu->name, pmu_name) || return !strcmp(pmu->name, pmu_name) ||
(pmu->is_uncore && pmu_uncore_alias_match(pmu_name, pmu->name)); (pmu->is_uncore && pmu_uncore_alias_match(pmu_name, pmu->name)) ||
/*
* jevents and tests use default_core as a marker for any core
* PMU as the PMU name varies across architectures.
*/
(pmu->is_core && !strcmp(pmu_name, "default_core"));
} }
bool perf_pmu__is_software(const struct perf_pmu *pmu) bool perf_pmu__is_software(const struct perf_pmu *pmu)
......
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