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>
 {
         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.
                 }
         }
         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)
 
        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);
        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);
 
 
        }
        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
 
 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,
        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);
 
         * 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. */