Thread (12 messages) flat view 12 messages, 3 authors, 2021-09-28

Re: [PATCH 2/5] perf jevents: Support ConfigCode

From: Ian Rogers <irogers@google.com>
Date: 2021-09-28 18:01:11
Also in: linux-perf-users, lkml

On Thu, Sep 16, 2021 at 5:39 AM John Garry [off-list ref] wrote:
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 <redacted>
Acked-by: Ian Rogers <irogers@google.com>

Thanks,
Ian
quoted hunk ↗ jump to hunk
---
 tools/perf/pmu-events/jevents.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c
index 6731b3cf0c2f..ef92c2fdd45d 100644
--- a/tools/perf/pmu-events/jevents.c
+++ b/tools/perf/pmu-events/jevents.c
@@ -575,10 +575,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) {
@@ -601,6 +603,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);
@@ -682,7 +690,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);
--
2.26.2
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help