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

perf pmu: Cache JSON events table

Cache the JSON events table so that finding it isn't done per
event/alias.

Change the events table find so that when the PMU is given, if the PMU
has no JSON events return null.

Update usage to always use the PMU variable.
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: Gaosheng Cui <cuigaosheng1@huawei.com>
Cc: Ingo Molnar <mingo@redhat.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>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20230824041330.266337-13-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f63a536f
...@@ -948,7 +948,7 @@ const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu) ...@@ -948,7 +948,7 @@ const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu)
{ {
const struct pmu_events_table *table = NULL; const struct pmu_events_table *table = NULL;
char *cpuid = perf_pmu__getcpuid(pmu); char *cpuid = perf_pmu__getcpuid(pmu);
int i; size_t i;
/* on some platforms which uses cpus map, cpuid can be NULL for /* on some platforms which uses cpus map, cpuid can be NULL for
* PMUs other than CORE PMUs. * PMUs other than CORE PMUs.
...@@ -968,7 +968,17 @@ const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu) ...@@ -968,7 +968,17 @@ const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu)
} }
} }
free(cpuid); free(cpuid);
if (!pmu)
return table;
for (i = 0; i < table->num_pmus; i++) {
const struct pmu_table_entry *table_pmu = &table->pmus[i];
const char *pmu_name = &big_c_string[table_pmu->pmu_name.offset];
if (pmu__name_match(pmu, pmu_name))
return table; return table;
}
return NULL;
} }
const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu) const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu)
......
...@@ -544,6 +544,7 @@ static int __test_core_pmu_event_aliases(char *pmu_name, int *count) ...@@ -544,6 +544,7 @@ static int __test_core_pmu_event_aliases(char *pmu_name, int *count)
INIT_LIST_HEAD(&pmu->list); INIT_LIST_HEAD(&pmu->list);
pmu->name = strdup(pmu_name); pmu->name = strdup(pmu_name);
pmu->events_table = table;
pmu_add_cpu_aliases_table(pmu, table); pmu_add_cpu_aliases_table(pmu, table);
res = pmu_events_table__find_event(table, pmu, "bp_l1_btb_correct", NULL, NULL); res = pmu_events_table__find_event(table, pmu, "bp_l1_btb_correct", NULL, NULL);
...@@ -583,6 +584,7 @@ static int __test_uncore_pmu_event_aliases(struct perf_pmu_test_pmu *test_pmu) ...@@ -583,6 +584,7 @@ static int __test_uncore_pmu_event_aliases(struct perf_pmu_test_pmu *test_pmu)
events_table = find_core_events_table("testarch", "testcpu"); events_table = find_core_events_table("testarch", "testcpu");
if (!events_table) if (!events_table)
return -1; return -1;
pmu->events_table = events_table;
pmu_add_cpu_aliases_table(pmu, events_table); pmu_add_cpu_aliases_table(pmu, events_table);
pmu_add_sys_aliases(pmu); pmu_add_sys_aliases(pmu);
......
...@@ -522,10 +522,10 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, int dirfd, const char *name ...@@ -522,10 +522,10 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, int dirfd, const char *name
} }
if (!pe) { if (!pe) {
/* Update an event from sysfs with json data. */ /* Update an event from sysfs with json data. */
const struct pmu_events_table *table = perf_pmu__find_events_table(pmu); if (pmu->events_table) {
pmu_events_table__find_event(pmu->events_table, pmu, name,
if (table) update_alias, alias);
pmu_events_table__find_event(table, pmu, name, update_alias, alias); }
} }
/* Scan event and remove leading zeroes, spaces, newlines, some /* Scan event and remove leading zeroes, spaces, newlines, some
...@@ -875,13 +875,10 @@ void pmu_add_cpu_aliases_table(struct perf_pmu *pmu, const struct pmu_events_tab ...@@ -875,13 +875,10 @@ void pmu_add_cpu_aliases_table(struct perf_pmu *pmu, const struct pmu_events_tab
static void pmu_add_cpu_aliases(struct perf_pmu *pmu) static void pmu_add_cpu_aliases(struct perf_pmu *pmu)
{ {
const struct pmu_events_table *table; if (!pmu->events_table)
table = perf_pmu__find_events_table(pmu);
if (!table)
return; return;
pmu_add_cpu_aliases_table(pmu, table); pmu_add_cpu_aliases_table(pmu, pmu->events_table);
} }
static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe, static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe,
...@@ -992,6 +989,7 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char ...@@ -992,6 +989,7 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char
if (pmu->is_uncore) if (pmu->is_uncore)
pmu->id = pmu_id(name); pmu->id = pmu_id(name);
pmu->max_precise = pmu_max_precise(dirfd, pmu); pmu->max_precise = pmu_max_precise(dirfd, pmu);
pmu->events_table = perf_pmu__find_events_table(pmu);
pmu_add_cpu_aliases(pmu); pmu_add_cpu_aliases(pmu);
pmu_add_sys_aliases(pmu); pmu_add_sys_aliases(pmu);
list_add_tail(&pmu->list, pmus); list_add_tail(&pmu->list, pmus);
......
...@@ -114,6 +114,10 @@ struct perf_pmu { ...@@ -114,6 +114,10 @@ struct perf_pmu {
* from json events in pmu-events.c. * from json events in pmu-events.c.
*/ */
struct list_head aliases; struct list_head aliases;
/**
* @events_table: The events table for json events in pmu-events.c.
*/
const struct pmu_events_table *events_table;
/** @caps_initialized: Has the list caps been initialized? */ /** @caps_initialized: Has the list caps been initialized? */
bool caps_initialized; bool caps_initialized;
/** @nr_caps: The length of the list caps. */ /** @nr_caps: The length of the list caps. */
......
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