summaryrefslogtreecommitdiff
path: root/tools/perf/pmu-events/jevents.c
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2022-05-11 14:15:23 -0700
committerArnaldo Carvalho de Melo <acme@redhat.com>2022-05-23 10:08:15 -0300
commit1634b5a1f11cf407255d42fcc1d6bf257d16adab (patch)
treec83c79c78f56127aca3dfab4413fa5672fdeea5d /tools/perf/pmu-events/jevents.c
parentafba2b08e12392c690b5962dacb73726457a1f6e (diff)
perf jevents: Modify match field
The match_field function looks for json values to append to the event string. As the C code processes these in order the output order matches that in the json dictionary. Python json readers read the entire dictionary and lose the ordering. To make the python and C output comparable make the C code first read the extra fields then append them to the event in an order not determined by their order in the file. Modify the pmu-events test so that test expectations match the new order. Reviewed-by: John Garry <john.garry@huawei.com> Signed-off-by: Ian Rogers <irogers@google.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Ananth Narayan <ananth.narayan@amd.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Andrew Kilroy <andrew.kilroy@arm.com> Cc: Caleb Biggers <caleb.biggers@intel.com> Cc: Felix Fietkau <nbd@nbd.name> Cc: Ingo Molnar <mingo@redhat.com> Cc: James Clark <james.clark@arm.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Kajol Jain <kjain@linux.ibm.com> Cc: Kan Liang <kan.liang@linux.intel.com> Cc: Kshipra Bopardikar <kshipra.bopardikar@intel.com> Cc: Like Xu <likexu@tencent.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Mathieu Poirier <mathieu.poirier@linaro.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Nick Forrington <nick.forrington@arm.com> Cc: Paul Clarke <pc@us.ibm.com> Cc: Perry Taylor <perry.taylor@intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Qi Liu <liuqi115@huawei.com> Cc: Ravi Bangoria <ravi.bangoria@amd.com> Cc: Sandipan Das <sandipan.das@amd.com> Cc: Santosh Shukla <santosh.shukla@amd.com> Cc: Stephane Eranian <eranian@google.com> Cc: Will Deacon <will@kernel.org> Cc: Xing Zhengjun <zhengjun.xing@linux.intel.com> Link: https://lore.kernel.org/r/20220511211526.1021908-5-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/pmu-events/jevents.c')
-rw-r--r--tools/perf/pmu-events/jevents.c82
1 files changed, 50 insertions, 32 deletions
diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c
index e1f7c7afd435..cee61c4ed59e 100644
--- a/tools/perf/pmu-events/jevents.c
+++ b/tools/perf/pmu-events/jevents.c
@@ -207,21 +207,6 @@ static struct msrmap {
{ NULL, NULL }
};
-static struct field {
- const char *field;
- const char *kernel;
-} fields[] = {
- { "UMask", "umask=" },
- { "CounterMask", "cmask=" },
- { "Invert", "inv=" },
- { "AnyThread", "any=" },
- { "EdgeDetect", "edge=" },
- { "SampleAfterValue", "period=" },
- { "FCMask", "fc_mask=" },
- { "PortMask", "ch_mask=" },
- { NULL, NULL }
-};
-
static void cut_comma(char *map, jsmntok_t *newval)
{
int i;
@@ -233,21 +218,6 @@ static void cut_comma(char *map, jsmntok_t *newval)
}
}
-static int match_field(char *map, jsmntok_t *field, int nz,
- char **event, jsmntok_t *val)
-{
- struct field *f;
- jsmntok_t newval = *val;
-
- for (f = fields; f->field; f++)
- if (json_streq(map, field, f->field) && nz) {
- cut_comma(map, &newval);
- addfield(map, event, ",", f->kernel, &newval);
- return 1;
- }
- return 0;
-}
-
static struct msrmap *lookup_msr(char *map, jsmntok_t *val)
{
jsmntok_t newval = *val;
@@ -581,6 +551,14 @@ static int json_events(const char *fn,
jsmntok_t *precise = NULL;
jsmntok_t *obj = tok++;
bool configcode_present = false;
+ char *umask = NULL;
+ char *cmask = NULL;
+ char *inv = NULL;
+ char *any = NULL;
+ char *edge = NULL;
+ char *period = NULL;
+ char *fc_mask = NULL;
+ char *ch_mask = NULL;
EXPECT(obj->type == JSMN_OBJECT, obj, "expected object");
for (j = 0; j < obj->size; j += 2) {
@@ -596,8 +574,23 @@ static int json_events(const char *fn,
"Expected string value");
nz = !json_streq(map, val, "0");
- if (match_field(map, field, nz, &event, val)) {
- /* ok */
+ /* match_field */
+ if (json_streq(map, field, "UMask") && nz) {
+ addfield(map, &umask, "", "umask=", val);
+ } else if (json_streq(map, field, "CounterMask") && nz) {
+ addfield(map, &cmask, "", "cmask=", val);
+ } else if (json_streq(map, field, "Invert") && nz) {
+ addfield(map, &inv, "", "inv=", val);
+ } else if (json_streq(map, field, "AnyThread") && nz) {
+ addfield(map, &any, "", "any=", val);
+ } else if (json_streq(map, field, "EdgeDetect") && nz) {
+ addfield(map, &edge, "", "edge=", val);
+ } else if (json_streq(map, field, "SampleAfterValue") && nz) {
+ addfield(map, &period, "", "period=", val);
+ } else if (json_streq(map, field, "FCMask") && nz) {
+ addfield(map, &fc_mask, "", "fc_mask=", val);
+ } else if (json_streq(map, field, "PortMask") && nz) {
+ addfield(map, &ch_mask, "", "ch_mask=", val);
} else if (json_streq(map, field, "EventCode")) {
char *code = NULL;
addfield(map, &code, "", "", val);
@@ -690,6 +683,23 @@ static int json_events(const char *fn,
else
snprintf(buf, sizeof buf, "event=%#llx", eventcode);
addfield(map, &event, ",", buf, NULL);
+ if (any)
+ addfield(map, &event, ",", any, NULL);
+ if (ch_mask)
+ addfield(map, &event, ",", ch_mask, NULL);
+ if (cmask)
+ addfield(map, &event, ",", cmask, NULL);
+ if (edge)
+ addfield(map, &event, ",", edge, NULL);
+ if (fc_mask)
+ addfield(map, &event, ",", fc_mask, NULL);
+ if (inv)
+ addfield(map, &event, ",", inv, NULL);
+ if (period)
+ addfield(map, &event, ",", period, NULL);
+ if (umask)
+ addfield(map, &event, ",", umask, NULL);
+
if (je.desc && extra_desc)
addfield(map, &je.desc, " ", extra_desc, NULL);
if (je.long_desc && extra_desc)
@@ -718,6 +728,14 @@ static int json_events(const char *fn,
je.event = real_event(je.name, event);
err = func(data, &je);
free_strings:
+ free(umask);
+ free(cmask);
+ free(inv);
+ free(any);
+ free(edge);
+ free(period);
+ free(fc_mask);
+ free(ch_mask);
free(event);
free(je.desc);
free(je.name);