mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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
					
				
					 4 changed files with 25 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -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 a new issue