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

perf pmu-events: Separate the metrics from events for no jevents



Separate the event and metric table when building without jevents. Add
find_core_metrics_table and perf_pmu__find_metrics_table while
renaming existing utilities to be event specific, so that users can
find the right table for their need.

Committer notes:

Fix the build on aarch64 with:

  tools/perf/arch/arm64/util/pmu.c
  @@ -32,7 +32,7 @@ const struct pmu_events_table *pmu_events_table__find(void)
  -               return perf_pmu__find_table(pmu);
  +               return perf_pmu__find_events_table(pmu);

Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
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: 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-6-irogers@google.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent db95818e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ const struct pmu_events_table *pmu_events_table__find(void)
	struct perf_pmu *pmu = pmu__find_core_pmu();

	if (pmu)
		return perf_pmu__find_table(pmu);
		return perf_pmu__find_events_table(pmu);

	return NULL;
}
+66 −22
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@
#include <string.h>
#include <stddef.h>

static const struct pmu_event pme_test_soc_cpu[] = {
static const struct pmu_event pmu_events__test_soc_cpu[] = {
	{
		.name = "l3_cache_rd",
		.event = "event=0x40",
@@ -105,6 +105,14 @@ static const struct pmu_event pme_test_soc_cpu[] = {
		.desc = "L2 BTB Correction",
		.topic = "branch",
	},
	{
		.name = 0,
		.event = 0,
		.desc = 0,
	},
};

static const struct pmu_metric pmu_metrics__test_soc_cpu[] = {
	{
		.metric_expr	= "1 / IPC",
		.metric_name	= "CPI",
@@ -170,9 +178,8 @@ static const struct pmu_event pme_test_soc_cpu[] = {
		.metric_name	= "L1D_Cache_Fill_BW",
	},
	{
		.name = 0,
		.event = 0,
		.desc = 0,
		.metric_expr = 0,
		.metric_name = 0,
	},
};

@@ -197,7 +204,8 @@ struct pmu_metrics_table {
struct pmu_events_map {
	const char *arch;
	const char *cpuid;
	const struct pmu_events_table table;
	const struct pmu_events_table event_table;
	const struct pmu_metrics_table metric_table;
};

/*
@@ -208,12 +216,14 @@ static const struct pmu_events_map pmu_events_map[] = {
	{
		.arch = "testarch",
		.cpuid = "testcpu",
		.table = { pme_test_soc_cpu },
		.event_table = { pmu_events__test_soc_cpu },
		.metric_table = { pmu_metrics__test_soc_cpu },
	},
	{
		.arch = 0,
		.cpuid = 0,
		.table = { 0 },
		.event_table = { 0 },
		.metric_table = { 0 },
	},
};

@@ -259,12 +269,9 @@ static const struct pmu_sys_events pmu_sys_event_tables[] = {
int pmu_events_table_for_each_event(const struct pmu_events_table *table, pmu_event_iter_fn fn,
				    void *data)
{
	for (const struct pmu_event *pe = &table->entries[0]; pe->name || pe->metric_expr; pe++) {
		int ret;
	for (const struct pmu_event *pe = &table->entries[0]; pe->name; pe++) {
		int ret = fn(pe, table, data);

		if (!pe->name)
			continue;
		ret = fn(pe, table, data);
		if (ret)
			return ret;
	}
@@ -276,19 +283,44 @@ int pmu_events_table_for_each_metric(const struct pmu_events_table *etable, pmu_
{
	struct pmu_metrics_table *table = (struct pmu_metrics_table *)etable;

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

		if (!pm->metric_expr)
			continue;
		ret = fn(pm, etable, data);
		if (ret)
			return ret;
	}
	return 0;
}

const struct pmu_events_table *perf_pmu__find_table(struct perf_pmu *pmu)
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;

	/* on some platforms which uses cpus map, cpuid can be NULL for
	 * PMUs other than CORE PMUs.
	 */
	if (!cpuid)
		return NULL;

	i = 0;
	for (;;) {
		const struct pmu_events_map *map = &pmu_events_map[i++];

		if (!map->cpuid)
			break;

		if (!strcmp_cpuid_str(map->cpuid, cpuid)) {
			table = &map->event_table;
			break;
		}
	}
	free(cpuid);
	return table;
}

const struct pmu_events_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu)
{
	const struct pmu_events_table *table = NULL;
	char *cpuid = perf_pmu__getcpuid(pmu);
@@ -308,7 +340,7 @@ const struct pmu_events_table *perf_pmu__find_table(struct perf_pmu *pmu)
			break;

		if (!strcmp_cpuid_str(map->cpuid, cpuid)) {
			table = &map->table;
			table = (const struct pmu_events_table *)&map->metric_table;
			break;
		}
	}
@@ -322,7 +354,18 @@ const struct pmu_events_table *find_core_events_table(const char *arch, const ch
	     tables->arch;
	     tables++) {
		if (!strcmp(tables->arch, arch) && !strcmp_cpuid_str(tables->cpuid, cpuid))
			return &tables->table;
			return &tables->event_table;
	}
	return NULL;
}

const struct pmu_events_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 NULL;
}
@@ -330,7 +373,7 @@ const struct pmu_events_table *find_core_events_table(const char *arch, const ch
int pmu_for_each_core_event(pmu_event_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_event(&tables->table, fn, data);
		int ret = pmu_events_table_for_each_event(&tables->event_table, fn, data);

		if (ret)
			return ret;
@@ -343,7 +386,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_events_table_for_each_metric(
			(const struct pmu_events_table *)&tables->metric_table, fn, data);

		if (ret)
			return ret;
+6 −1
Original line number Diff line number Diff line
@@ -625,7 +625,7 @@ int pmu_events_table_for_each_metric(const struct pmu_events_table *table,
        return 0;
}

const struct pmu_events_table *perf_pmu__find_table(struct perf_pmu *pmu)
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);
@@ -663,6 +663,11 @@ 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)
{
        return (struct pmu_events_table *)find_core_events_table(arch, cpuid);
}

int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data)
{
        for (const struct pmu_events_map *tables = &pmu_events_map[0];
+3 −1
Original line number Diff line number Diff line
@@ -63,8 +63,10 @@ int pmu_events_table_for_each_event(const struct pmu_events_table *table, pmu_ev
int pmu_events_table_for_each_metric(const struct pmu_events_table *table, pmu_metric_iter_fn fn,
				     void *data);

const struct pmu_events_table *perf_pmu__find_table(struct perf_pmu *pmu);
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_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);
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);

+1 −1
Original line number Diff line number Diff line
@@ -186,7 +186,7 @@ static int expand_metric_events(void)
	TEST_ASSERT_VAL("failed to get evlist", evlist);

	rblist__init(&metric_events);
	pme_test = find_core_events_table("testarch", "testcpu");
	pme_test = find_core_metrics_table("testarch", "testcpu");
	ret = metricgroup__parse_groups_test(evlist, pme_test, metric_str,
					     false, false, &metric_events);
	if (ret < 0) {
Loading