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: Ian 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.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
f63a536f03
commit
7c52f10c0d
@ -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;
|
||||
char *cpuid = perf_pmu__getcpuid(pmu);
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
/* on some platforms which uses cpus map, cpuid can be NULL for
|
||||
* PMUs other than CORE PMUs.
|
||||
@ -968,7 +968,17 @@ const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu)
|
||||
}
|
||||
}
|
||||
free(cpuid);
|
||||
return table;
|
||||
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 NULL;
|
||||
}
|
||||
|
||||
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)
|
||||
INIT_LIST_HEAD(&pmu->list);
|
||||
pmu->name = strdup(pmu_name);
|
||||
|
||||
pmu->events_table = table;
|
||||
pmu_add_cpu_aliases_table(pmu, table);
|
||||
|
||||
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)
|
||||
events_table = find_core_events_table("testarch", "testcpu");
|
||||
if (!events_table)
|
||||
return -1;
|
||||
pmu->events_table = events_table;
|
||||
pmu_add_cpu_aliases_table(pmu, events_table);
|
||||
pmu_add_sys_aliases(pmu);
|
||||
|
||||
|
@ -522,10 +522,10 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, int dirfd, const char *name
|
||||
}
|
||||
if (!pe) {
|
||||
/* Update an event from sysfs with json data. */
|
||||
const struct pmu_events_table *table = perf_pmu__find_events_table(pmu);
|
||||
|
||||
if (table)
|
||||
pmu_events_table__find_event(table, pmu, name, update_alias, alias);
|
||||
if (pmu->events_table) {
|
||||
pmu_events_table__find_event(pmu->events_table, pmu, name,
|
||||
update_alias, alias);
|
||||
}
|
||||
}
|
||||
|
||||
/* 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
|
||||
|
||||
static void pmu_add_cpu_aliases(struct perf_pmu *pmu)
|
||||
{
|
||||
const struct pmu_events_table *table;
|
||||
|
||||
table = perf_pmu__find_events_table(pmu);
|
||||
if (!table)
|
||||
if (!pmu->events_table)
|
||||
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,
|
||||
@ -992,6 +989,7 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char
|
||||
if (pmu->is_uncore)
|
||||
pmu->id = pmu_id(name);
|
||||
pmu->max_precise = pmu_max_precise(dirfd, pmu);
|
||||
pmu->events_table = perf_pmu__find_events_table(pmu);
|
||||
pmu_add_cpu_aliases(pmu);
|
||||
pmu_add_sys_aliases(pmu);
|
||||
list_add_tail(&pmu->list, pmus);
|
||||
|
@ -114,6 +114,10 @@ struct perf_pmu {
|
||||
* from json events in pmu-events.c.
|
||||
*/
|
||||
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? */
|
||||
bool caps_initialized;
|
||||
/** @nr_caps: The length of the list caps. */
|
||||
|
Loading…
Reference in New Issue
Block a user