Commit f8ea2c15 authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo
Browse files

perf pmu-events: Introduce pmu_metrics_table



Add a metrics table that is just a cast from pmu_events_table. This
changes the APIs so that event and metric usage of the underlying
table is different. For the no jevents case the tables are already
separate, later changes will separate the tables for the jevents case.

Reviewed-by: default avatarKajol Jain <kjain@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: Caleb Biggers <caleb.biggers@intel.com>
Cc: Florian Fischer <florian.fischer@muhq.space>
Cc: Ian Rogers <irogers@google.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: Kan Liang <kan.liang@linux.intel.com>
Cc: Kang Minchul <tegongkang@gmail.com>
Cc: Kim Phillips <kim.phillips@amd.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Perry Taylor <perry.taylor@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Rob Herring <robh@kernel.org>
Cc: Sandipan Das <sandipan.das@amd.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Will Deacon <will@kernel.org>
Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linuxppc-dev@lists.ozlabs.org
Link: https://lore.kernel.org/r/20230126233645.200509-10-irogers@google.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 9f587cc9
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -23,6 +23,15 @@ static struct perf_pmu *pmu__find_core_pmu(void)

		return pmu;
	}
	return NULL;
}

const struct pmu_metrics_table *pmu_metrics_table__find(void)
{
	struct perf_pmu *pmu = pmu__find_core_pmu();

	if (pmu)
		return perf_pmu__find_metrics_table(pmu);

	return NULL;
}
+9 −12
Original line number Diff line number Diff line
@@ -278,13 +278,11 @@ int pmu_events_table_for_each_event(const struct pmu_events_table *table, pmu_ev
	return 0;
}

int pmu_events_table_for_each_metric(const struct pmu_events_table *etable, pmu_metric_iter_fn fn,
int pmu_metrics_table_for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn,
				      void *data)
{
	struct pmu_metrics_table *table = (struct pmu_metrics_table *)etable;

	for (const struct pmu_metric *pm = &table->entries[0]; pm->metric_expr; pm++) {
		int ret = fn(pm, etable, data);
		int ret = fn(pm, table, data);

		if (ret)
			return ret;
@@ -320,9 +318,9 @@ const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu)
	return table;
}

const struct pmu_events_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu)
const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu)
{
	const struct pmu_events_table *table = NULL;
	const struct pmu_metrics_table *table = NULL;
	char *cpuid = perf_pmu__getcpuid(pmu);
	int i;

@@ -340,7 +338,7 @@ const struct pmu_events_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu
			break;

		if (!strcmp_cpuid_str(map->cpuid, cpuid)) {
			table = (const struct pmu_events_table *)&map->metric_table;
			table = &map->metric_table;
			break;
		}
	}
@@ -359,13 +357,13 @@ const struct pmu_events_table *find_core_events_table(const char *arch, const ch
	return NULL;
}

const struct pmu_events_table *find_core_metrics_table(const char *arch, const char *cpuid)
const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid)
{
	for (const struct pmu_events_map *tables = &pmu_events_map[0];
	     tables->arch;
	     tables++) {
		if (!strcmp(tables->arch, arch) && !strcmp_cpuid_str(tables->cpuid, cpuid))
			return (const struct pmu_events_table *)&tables->metric_table;
			return &tables->metric_table;
	}
	return NULL;
}
@@ -386,8 +384,7 @@ int pmu_for_each_core_metric(pmu_metric_iter_fn fn, void *data)
	for (const struct pmu_events_map *tables = &pmu_events_map[0];
	     tables->arch;
	     tables++) {
		int ret = pmu_events_table_for_each_metric(
			(const struct pmu_events_table *)&tables->metric_table, fn, data);
		int ret = pmu_metrics_table_for_each_metric(&tables->metric_table, fn, data);

		if (ret)
			return ret;
+15 −6
Original line number Diff line number Diff line
@@ -611,10 +611,12 @@ int pmu_events_table_for_each_event(const struct pmu_events_table *table,
        return 0;
}

int pmu_events_table_for_each_metric(const struct pmu_events_table *table,
int pmu_metrics_table_for_each_metric(const struct pmu_metrics_table *mtable,
                                     pmu_metric_iter_fn fn,
                                     void *data)
{
        const struct pmu_events_table *table = (const struct pmu_events_table *)mtable;

        for (size_t i = 0; i < table->length; i++) {
                struct pmu_metric pm;
                int ret;
@@ -622,7 +624,7 @@ int pmu_events_table_for_each_metric(const struct pmu_events_table *table,
                decompress_metric(table->entries[i].offset, &pm);
                if (!pm.metric_expr)
                        continue;
                ret = fn(&pm, table, data);
                ret = fn(&pm, mtable, data);
                if (ret)
                        return ret;
        }
@@ -656,6 +658,11 @@ const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu)
        return table;
}

const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu)
{
        return (struct pmu_metrics_table *)perf_pmu__find_events_table(pmu);
}

const struct pmu_events_table *find_core_events_table(const char *arch, const char *cpuid)
{
        for (const struct pmu_events_map *tables = &pmu_events_map[0];
@@ -667,9 +674,9 @@ const struct pmu_events_table *find_core_events_table(const char *arch, const ch
        return NULL;
}

const struct pmu_events_table *find_core_metrics_table(const char *arch, const char *cpuid)
const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid)
{
        return (struct pmu_events_table *)find_core_events_table(arch, cpuid);
       return (struct pmu_metrics_table *)find_core_events_table(arch, cpuid);
}

int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data)
@@ -690,7 +697,8 @@ int pmu_for_each_core_metric(pmu_metric_iter_fn fn, void *data)
        for (const struct pmu_events_map *tables = &pmu_events_map[0];
             tables->arch;
             tables++) {
                int ret = pmu_events_table_for_each_metric(&tables->table, fn, data);
                int ret = pmu_metrics_table_for_each_metric(
                                (struct pmu_metrics_table *)&tables->table, fn, data);

                if (ret)
                        return ret;
@@ -727,7 +735,8 @@ int pmu_for_each_sys_metric(pmu_metric_iter_fn fn, void *data)
        for (const struct pmu_sys_events *tables = &pmu_sys_event_tables[0];
             tables->name;
             tables++) {
                int ret = pmu_events_table_for_each_metric(&tables->table, fn, data);
                int ret = pmu_metrics_table_for_each_metric(
                                (struct pmu_metrics_table *)&tables->table, fn, data);

                if (ret)
                        return ret;
+6 −4
Original line number Diff line number Diff line
@@ -39,28 +39,30 @@ struct pmu_metric {
};

struct pmu_events_table;
struct pmu_metrics_table;

typedef int (*pmu_event_iter_fn)(const struct pmu_event *pe,
				 const struct pmu_events_table *table,
				 void *data);

typedef int (*pmu_metric_iter_fn)(const struct pmu_metric *pm,
				  const struct pmu_events_table *table,
				  const struct pmu_metrics_table *table,
				  void *data);

int pmu_events_table_for_each_event(const struct pmu_events_table *table, pmu_event_iter_fn fn,
				    void *data);
int pmu_events_table_for_each_metric(const struct pmu_events_table *table, pmu_metric_iter_fn fn,
int pmu_metrics_table_for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn,
				     void *data);

const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu);
const struct pmu_events_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu);
const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu);
const struct pmu_events_table *find_core_events_table(const char *arch, const char *cpuid);
const struct pmu_events_table *find_core_metrics_table(const char *arch, const char *cpuid);
const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid);
int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data);
int pmu_for_each_core_metric(pmu_metric_iter_fn fn, void *data);

const struct pmu_events_table *find_sys_events_table(const char *name);
const struct pmu_metrics_table *find_sys_metrics_table(const char *name);
int pmu_for_each_sys_event(pmu_event_iter_fn fn, void *data);
int pmu_for_each_sys_metric(pmu_metric_iter_fn fn, void *data);

+1 −1
Original line number Diff line number Diff line
@@ -180,7 +180,7 @@ static int expand_metric_events(void)
	struct evlist *evlist;
	struct rblist metric_events;
	const char metric_str[] = "CPI";
	const struct pmu_events_table *pme_test;
	const struct pmu_metrics_table *pme_test;

	evlist = evlist__new();
	TEST_ASSERT_VAL("failed to get evlist", evlist);
Loading