Commit d2f327ac authored by Jin Yao's avatar Jin Yao Committed by Arnaldo Carvalho de Melo
Browse files

perf tools: Support pmu prefix for mem-load event



The perf_mem_events__name() can generate the mem-load event name.
It uses a variable 'mem_loads_name__init' to avoid generating the
event name every time (because perf_pmu__scan takes some time).

The perf_mem_events__name() assumes the pmu is "cpu" but it's not
correct for hybrid platform. For Alderlake, the pmu is "cpu_core" or
"cpu_atom"

Introduce a new parameter 'pmu_name' in perf_mem_events__name
to let the caller specify a pmu name.

Considering such event name is x86 specific, so move
perf_mem_events[] to arch/x86/util/mem-events.c.

We still keep the variable 'mem_loads_name__init' but it's only
used when pmu_name is NULL (compatible for original behavior). When
pmu_name is not NULL (e.g. "cpu_core"), this patch doesn't have
optimization. That can be implemented in follow up patch.

Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20210527001610.10553-3-yao.jin@linux.intel.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ddc11da5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ struct perf_mem_event *perf_mem_events__ptr(int i)
	return &perf_mem_events[i];
}

char *perf_mem_events__name(int i)
char *perf_mem_events__name(int i, char *pmu_name __maybe_unused)
{
	struct perf_mem_event *e = perf_mem_events__ptr(i);

+1 −1
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
#include "mem-events.h"

/* PowerPC does not support 'ldlat' parameter. */
char *perf_mem_events__name(int i)
char *perf_mem_events__name(int i, char *pmu_name __maybe_unused)
{
	if (i == PERF_MEM_EVENTS__LOAD)
		return (char *) "cpu/mem-loads/";
+28 −7
Original line number Diff line number Diff line
@@ -7,7 +7,23 @@ static char mem_loads_name[100];
static bool mem_loads_name__init;

#define MEM_LOADS_AUX		0x8203
#define MEM_LOADS_AUX_NAME	"{cpu/mem-loads-aux/,cpu/mem-loads,ldlat=%u/pp}:S"
#define MEM_LOADS_AUX_NAME     "{%s/mem-loads-aux/,%s/mem-loads,ldlat=%u/}:P"

#define E(t, n, s) { .tag = t, .name = n, .sysfs_name = s }

static struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = {
	E("ldlat-loads",	"%s/mem-loads,ldlat=%u/P",	"%s/events/mem-loads"),
	E("ldlat-stores",	"cpu/mem-stores/P",		"cpu/events/mem-stores"),
	E(NULL,			NULL,				NULL),
};

struct perf_mem_event *perf_mem_events__ptr(int i)
{
	if (i >= PERF_MEM_EVENTS__MAX)
		return NULL;

	return &perf_mem_events[i];
}

bool is_mem_loads_aux_event(struct evsel *leader)
{
@@ -22,7 +38,7 @@ bool is_mem_loads_aux_event(struct evsel *leader)
	return leader->core.attr.config == MEM_LOADS_AUX;
}

char *perf_mem_events__name(int i)
char *perf_mem_events__name(int i, char *pmu_name)
{
	struct perf_mem_event *e = perf_mem_events__ptr(i);

@@ -30,17 +46,22 @@ char *perf_mem_events__name(int i)
		return NULL;

	if (i == PERF_MEM_EVENTS__LOAD) {
		if (mem_loads_name__init)
		if (mem_loads_name__init && !pmu_name)
			return mem_loads_name;

		if (!pmu_name) {
			mem_loads_name__init = true;
			pmu_name = (char *)"cpu";
		}

		if (pmu_have_event("cpu", "mem-loads-aux")) {
		if (pmu_have_event(pmu_name, "mem-loads-aux")) {
			scnprintf(mem_loads_name, sizeof(mem_loads_name),
				  MEM_LOADS_AUX_NAME, perf_mem_events__loads_ldlat);
				  MEM_LOADS_AUX_NAME, pmu_name, pmu_name,
				  perf_mem_events__loads_ldlat);
		} else {
			scnprintf(mem_loads_name, sizeof(mem_loads_name),
				  e->name, perf_mem_events__loads_ldlat);
				  e->name, pmu_name,
				  perf_mem_events__loads_ldlat);
		}
		return mem_loads_name;
	}
+2 −2
Original line number Diff line number Diff line
@@ -2971,13 +2971,13 @@ static int perf_c2c__record(int argc, const char **argv)

		if (!e->supported) {
			pr_err("failed: event '%s' not supported\n",
			       perf_mem_events__name(j));
			       perf_mem_events__name(j, NULL));
			free(rec_argv);
			return -1;
		}

		rec_argv[i++] = "-e";
		rec_argv[i++] = perf_mem_events__name(j);
		rec_argv[i++] = perf_mem_events__name(j, NULL);
	}

	if (all_user)
+2 −2
Original line number Diff line number Diff line
@@ -135,13 +135,13 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)

		if (!e->supported) {
			pr_err("failed: event '%s' not supported\n",
			       perf_mem_events__name(j));
			       perf_mem_events__name(j, NULL));
			free(rec_argv);
			return -1;
		}

		rec_argv[i++] = "-e";
		rec_argv[i++] = perf_mem_events__name(j);
		rec_argv[i++] = perf_mem_events__name(j, NULL);
	}

	if (all_user)
Loading