Commit d60bad10 authored by John Garry's avatar John Garry Committed by Arnaldo Carvalho de Melo
Browse files

perf jevents: Support ConfigCode



Some PMUs use "config=XXX" for eventcodes, like:

more /sys/bus/event_source/devices/hisi_sccl1_ddrc3/events/act_cmd
config=0x5

However jevents would give an alias with .event field "event=0x5" for
this event. This is handled without issue by the parse events code, but
the pmu alias code gets a bit confused, as it warns about assigning
"event=0x5" over "config=0x5" in perf_pmu_assign_str() when merging
aliases: ./perf stat -v -e act_cmd ...  alias act_cmd differs in field
'value' ...

To make things a bit more straightforward, allow jevents to support
"config=XXX" as well, by supporting a "ConfigCode" field.

Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
Acked-by: default avatarIan Rogers <irogers@google.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Shaokun Zhang <zhangshaokun@hisilicon.com>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linuxarm@huawei.com
Cc: liuqi115@huawei.com
Link: https://lore.kernel.org/r/1631795665-240946-3-git-send-email-john.garry@huawei.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 4f9d4f8a
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -576,10 +576,12 @@ static int json_events(const char *fn,
		struct json_event je = {};
		char *arch_std = NULL;
		unsigned long long eventcode = 0;
		unsigned long long configcode = 0;
		struct msrmap *msr = NULL;
		jsmntok_t *msrval = NULL;
		jsmntok_t *precise = NULL;
		jsmntok_t *obj = tok++;
		bool configcode_present = false;

		EXPECT(obj->type == JSMN_OBJECT, obj, "expected object");
		for (j = 0; j < obj->size; j += 2) {
@@ -602,6 +604,12 @@ static int json_events(const char *fn,
				addfield(map, &code, "", "", val);
				eventcode |= strtoul(code, NULL, 0);
				free(code);
			} else if (json_streq(map, field, "ConfigCode")) {
				char *code = NULL;
				addfield(map, &code, "", "", val);
				configcode |= strtoul(code, NULL, 0);
				free(code);
				configcode_present = true;
			} else if (json_streq(map, field, "ExtSel")) {
				char *code = NULL;
				addfield(map, &code, "", "", val);
@@ -683,6 +691,9 @@ static int json_events(const char *fn,
				addfield(map, &extra_desc, " ",
						"(Precise event)", NULL);
		}
		if (configcode_present)
			snprintf(buf, sizeof buf, "config=%#llx", configcode);
		else
			snprintf(buf, sizeof buf, "event=%#llx", eventcode);
		addfield(map, &event, ",", buf, NULL);
		if (je.desc && extra_desc)