perf jevents: Support ConfigCode
authorJohn Garry <john.garry@huawei.com>
Thu, 16 Sep 2021 12:34:22 +0000 (20:34 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 28 Sep 2021 19:14:32 +0000 (16:14 -0300)
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>
tools/perf/pmu-events/jevents.c

index 323e1dfe2436c04962b0b3fb0e1e071c585ed923..19497e4f8a86d54889beb899f1544102f91f369b 100644 (file)
@@ -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);