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: John Garry <john.garry@huawei.com> Acked-by: Ian 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: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
4f9d4f8aa7
commit
d60bad10c4
|
@ -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,7 +691,10 @@ static int json_events(const char *fn,
|
|||
addfield(map, &extra_desc, " ",
|
||||
"(Precise event)", NULL);
|
||||
}
|
||||
snprintf(buf, sizeof buf, "event=%#llx", eventcode);
|
||||
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)
|
||||
addfield(map, &je.desc, " ", extra_desc, NULL);
|
||||
|
|
Loading…
Reference in New Issue