hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/tools/perf/pmu-events/jevents.c
....@@ -48,10 +48,39 @@
4848 #include <linux/list.h>
4949 #include "jsmn.h"
5050 #include "json.h"
51
-#include "jevents.h"
51
+#include "pmu-events.h"
5252
5353 int verbose;
5454 char *prog;
55
+
56
+struct json_event {
57
+ char *name;
58
+ char *event;
59
+ char *desc;
60
+ char *long_desc;
61
+ char *pmu;
62
+ char *unit;
63
+ char *perpkg;
64
+ char *aggr_mode;
65
+ char *metric_expr;
66
+ char *metric_name;
67
+ char *metric_group;
68
+ char *deprecated;
69
+ char *metric_constraint;
70
+};
71
+
72
+enum aggr_mode_class convert(const char *aggr_mode)
73
+{
74
+ if (!strcmp(aggr_mode, "PerCore"))
75
+ return PerCore;
76
+ else if (!strcmp(aggr_mode, "PerChip"))
77
+ return PerChip;
78
+
79
+ pr_err("%s: Wrong AggregationMode value '%s'\n", prog, aggr_mode);
80
+ return -1;
81
+}
82
+
83
+typedef int (*func)(void *data, struct json_event *je);
5584
5685 int eprintf(int level, int var, const char *fmt, ...)
5786 {
....@@ -69,11 +98,6 @@
6998 va_end(args);
7099
71100 return ret;
72
-}
73
-
74
-__attribute__((weak)) char *get_cpu_str(void)
75
-{
76
- return NULL;
77101 }
78102
79103 static void addfield(char *map, char **dst, const char *sep,
....@@ -235,6 +259,12 @@
235259 { "iMPH-U", "uncore_arb" },
236260 { "CPU-M-CF", "cpum_cf" },
237261 { "CPU-M-SF", "cpum_sf" },
262
+ { "UPI LL", "uncore_upi" },
263
+ { "hisi_sccl,ddrc", "hisi_sccl,ddrc" },
264
+ { "hisi_sccl,hha", "hisi_sccl,hha" },
265
+ { "hisi_sccl,l3c", "hisi_sccl,l3c" },
266
+ { "L3PMC", "amd_l3" },
267
+ { "DFPMC", "amd_df" },
238268 {}
239269 };
240270
....@@ -313,11 +343,7 @@
313343 close_table = 1;
314344 }
315345
316
-static int print_events_table_entry(void *data, char *name, char *event,
317
- char *desc, char *long_desc,
318
- char *pmu, char *unit, char *perpkg,
319
- char *metric_expr,
320
- char *metric_name, char *metric_group)
346
+static int print_events_table_entry(void *data, struct json_event *je)
321347 {
322348 struct perf_entry_data *pd = data;
323349 FILE *outfp = pd->outfp;
....@@ -329,26 +355,32 @@
329355 */
330356 fprintf(outfp, "{\n");
331357
332
- if (name)
333
- fprintf(outfp, "\t.name = \"%s\",\n", name);
334
- if (event)
335
- fprintf(outfp, "\t.event = \"%s\",\n", event);
336
- fprintf(outfp, "\t.desc = \"%s\",\n", desc);
358
+ if (je->name)
359
+ fprintf(outfp, "\t.name = \"%s\",\n", je->name);
360
+ if (je->event)
361
+ fprintf(outfp, "\t.event = \"%s\",\n", je->event);
362
+ fprintf(outfp, "\t.desc = \"%s\",\n", je->desc);
337363 fprintf(outfp, "\t.topic = \"%s\",\n", topic);
338
- if (long_desc && long_desc[0])
339
- fprintf(outfp, "\t.long_desc = \"%s\",\n", long_desc);
340
- if (pmu)
341
- fprintf(outfp, "\t.pmu = \"%s\",\n", pmu);
342
- if (unit)
343
- fprintf(outfp, "\t.unit = \"%s\",\n", unit);
344
- if (perpkg)
345
- fprintf(outfp, "\t.perpkg = \"%s\",\n", perpkg);
346
- if (metric_expr)
347
- fprintf(outfp, "\t.metric_expr = \"%s\",\n", metric_expr);
348
- if (metric_name)
349
- fprintf(outfp, "\t.metric_name = \"%s\",\n", metric_name);
350
- if (metric_group)
351
- fprintf(outfp, "\t.metric_group = \"%s\",\n", metric_group);
364
+ if (je->long_desc && je->long_desc[0])
365
+ fprintf(outfp, "\t.long_desc = \"%s\",\n", je->long_desc);
366
+ if (je->pmu)
367
+ fprintf(outfp, "\t.pmu = \"%s\",\n", je->pmu);
368
+ if (je->unit)
369
+ fprintf(outfp, "\t.unit = \"%s\",\n", je->unit);
370
+ if (je->perpkg)
371
+ fprintf(outfp, "\t.perpkg = \"%s\",\n", je->perpkg);
372
+ if (je->aggr_mode)
373
+ fprintf(outfp, "\t.aggr_mode = \"%d\",\n", convert(je->aggr_mode));
374
+ if (je->metric_expr)
375
+ fprintf(outfp, "\t.metric_expr = \"%s\",\n", je->metric_expr);
376
+ if (je->metric_name)
377
+ fprintf(outfp, "\t.metric_name = \"%s\",\n", je->metric_name);
378
+ if (je->metric_group)
379
+ fprintf(outfp, "\t.metric_group = \"%s\",\n", je->metric_group);
380
+ if (je->deprecated)
381
+ fprintf(outfp, "\t.deprecated = \"%s\",\n", je->deprecated);
382
+ if (je->metric_constraint)
383
+ fprintf(outfp, "\t.metric_constraint = \"%s\",\n", je->metric_constraint);
352384 fprintf(outfp, "},\n");
353385
354386 return 0;
....@@ -363,22 +395,25 @@
363395 char *pmu;
364396 char *unit;
365397 char *perpkg;
398
+ char *aggr_mode;
366399 char *metric_expr;
367400 char *metric_name;
368401 char *metric_group;
402
+ char *deprecated;
403
+ char *metric_constraint;
369404 };
370405
371
-#define ADD_EVENT_FIELD(field) do { if (field) { \
372
- es->field = strdup(field); \
406
+#define ADD_EVENT_FIELD(field) do { if (je->field) { \
407
+ es->field = strdup(je->field); \
373408 if (!es->field) \
374409 goto out_free; \
375410 } } while (0)
376411
377412 #define FREE_EVENT_FIELD(field) free(es->field)
378413
379
-#define TRY_FIXUP_FIELD(field) do { if (es->field && !*field) {\
380
- *field = strdup(es->field); \
381
- if (!*field) \
414
+#define TRY_FIXUP_FIELD(field) do { if (es->field && !je->field) {\
415
+ je->field = strdup(es->field); \
416
+ if (!je->field) \
382417 return -ENOMEM; \
383418 } } while (0)
384419
....@@ -390,9 +425,11 @@
390425 op(pmu); \
391426 op(unit); \
392427 op(perpkg); \
428
+ op(aggr_mode); \
393429 op(metric_expr); \
394430 op(metric_name); \
395431 op(metric_group); \
432
+ op(deprecated); \
396433 } while (0)
397434
398435 static LIST_HEAD(arch_std_events);
....@@ -403,18 +440,14 @@
403440
404441 list_for_each_entry_safe(es, next, &arch_std_events, list) {
405442 FOR_ALL_EVENT_STRUCT_FIELDS(FREE_EVENT_FIELD);
406
- list_del(&es->list);
443
+ list_del_init(&es->list);
407444 free(es);
408445 }
409446 }
410447
411
-static int save_arch_std_events(void *data, char *name, char *event,
412
- char *desc, char *long_desc, char *pmu,
413
- char *unit, char *perpkg, char *metric_expr,
414
- char *metric_name, char *metric_group)
448
+static int save_arch_std_events(void *data, struct json_event *je)
415449 {
416450 struct event_struct *es;
417
- struct stat *sb = data;
418451
419452 es = malloc(sizeof(*es));
420453 if (!es)
....@@ -472,22 +505,15 @@
472505 }
473506
474507 static int
475
-try_fixup(const char *fn, char *arch_std, char **event, char **desc,
476
- char **name, char **long_desc, char **pmu, char **filter,
477
- char **perpkg, char **unit, char **metric_expr, char **metric_name,
478
- char **metric_group, unsigned long long eventcode)
508
+try_fixup(const char *fn, char *arch_std, struct json_event *je, char **event)
479509 {
480510 /* try to find matching event from arch standard values */
481511 struct event_struct *es;
482512
483513 list_for_each_entry(es, &arch_std_events, list) {
484514 if (!strcmp(arch_std, es->name)) {
485
- if (!eventcode && es->event) {
486
- /* allow EventCode to be overridden */
487
- free(*event);
488
- *event = NULL;
489
- }
490515 FOR_ALL_EVENT_STRUCT_FIELDS(TRY_FIXUP_FIELD);
516
+ *event = je->event;
491517 return 0;
492518 }
493519 }
....@@ -498,13 +524,9 @@
498524 }
499525
500526 /* Call func with each event in the json file */
501
-int json_events(const char *fn,
502
- int (*func)(void *data, char *name, char *event, char *desc,
503
- char *long_desc,
504
- char *pmu, char *unit, char *perpkg,
505
- char *metric_expr,
506
- char *metric_name, char *metric_group),
507
- void *data)
527
+static int json_events(const char *fn,
528
+ int (*func)(void *data, struct json_event *je),
529
+ void *data)
508530 {
509531 int err;
510532 size_t size;
....@@ -522,16 +544,10 @@
522544 EXPECT(tokens->type == JSMN_ARRAY, tokens, "expected top level array");
523545 tok = tokens + 1;
524546 for (i = 0; i < tokens->size; i++) {
525
- char *event = NULL, *desc = NULL, *name = NULL;
526
- char *long_desc = NULL;
547
+ char *event = NULL;
527548 char *extra_desc = NULL;
528
- char *pmu = NULL;
529549 char *filter = NULL;
530
- char *perpkg = NULL;
531
- char *unit = NULL;
532
- char *metric_expr = NULL;
533
- char *metric_name = NULL;
534
- char *metric_group = NULL;
550
+ struct json_event je = {};
535551 char *arch_std = NULL;
536552 unsigned long long eventcode = 0;
537553 struct msrmap *msr = NULL;
....@@ -563,17 +579,17 @@
563579 } else if (json_streq(map, field, "ExtSel")) {
564580 char *code = NULL;
565581 addfield(map, &code, "", "", val);
566
- eventcode |= strtoul(code, NULL, 0) << 21;
582
+ eventcode |= strtoul(code, NULL, 0) << 8;
567583 free(code);
568584 } else if (json_streq(map, field, "EventName")) {
569
- addfield(map, &name, "", "", val);
585
+ addfield(map, &je.name, "", "", val);
570586 } else if (json_streq(map, field, "BriefDescription")) {
571
- addfield(map, &desc, "", "", val);
572
- fixdesc(desc);
587
+ addfield(map, &je.desc, "", "", val);
588
+ fixdesc(je.desc);
573589 } else if (json_streq(map, field,
574590 "PublicDescription")) {
575
- addfield(map, &long_desc, "", "", val);
576
- fixdesc(long_desc);
591
+ addfield(map, &je.long_desc, "", "", val);
592
+ fixdesc(je.long_desc);
577593 } else if (json_streq(map, field, "PEBS") && nz) {
578594 precise = val;
579595 } else if (json_streq(map, field, "MSRIndex") && nz) {
....@@ -593,30 +609,36 @@
593609
594610 ppmu = field_to_perf(unit_to_pmu, map, val);
595611 if (ppmu) {
596
- pmu = strdup(ppmu);
612
+ je.pmu = strdup(ppmu);
597613 } else {
598
- if (!pmu)
599
- pmu = strdup("uncore_");
600
- addfield(map, &pmu, "", "", val);
601
- for (s = pmu; *s; s++)
614
+ if (!je.pmu)
615
+ je.pmu = strdup("uncore_");
616
+ addfield(map, &je.pmu, "", "", val);
617
+ for (s = je.pmu; *s; s++)
602618 *s = tolower(*s);
603619 }
604
- addfield(map, &desc, ". ", "Unit: ", NULL);
605
- addfield(map, &desc, "", pmu, NULL);
606
- addfield(map, &desc, "", " ", NULL);
620
+ addfield(map, &je.desc, ". ", "Unit: ", NULL);
621
+ addfield(map, &je.desc, "", je.pmu, NULL);
622
+ addfield(map, &je.desc, "", " ", NULL);
607623 } else if (json_streq(map, field, "Filter")) {
608624 addfield(map, &filter, "", "", val);
609625 } else if (json_streq(map, field, "ScaleUnit")) {
610
- addfield(map, &unit, "", "", val);
626
+ addfield(map, &je.unit, "", "", val);
611627 } else if (json_streq(map, field, "PerPkg")) {
612
- addfield(map, &perpkg, "", "", val);
628
+ addfield(map, &je.perpkg, "", "", val);
629
+ } else if (json_streq(map, field, "AggregationMode")) {
630
+ addfield(map, &je.aggr_mode, "", "", val);
631
+ } else if (json_streq(map, field, "Deprecated")) {
632
+ addfield(map, &je.deprecated, "", "", val);
613633 } else if (json_streq(map, field, "MetricName")) {
614
- addfield(map, &metric_name, "", "", val);
634
+ addfield(map, &je.metric_name, "", "", val);
615635 } else if (json_streq(map, field, "MetricGroup")) {
616
- addfield(map, &metric_group, "", "", val);
636
+ addfield(map, &je.metric_group, "", "", val);
637
+ } else if (json_streq(map, field, "MetricConstraint")) {
638
+ addfield(map, &je.metric_constraint, "", "", val);
617639 } else if (json_streq(map, field, "MetricExpr")) {
618
- addfield(map, &metric_expr, "", "", val);
619
- for (s = metric_expr; *s; s++)
640
+ addfield(map, &je.metric_expr, "", "", val);
641
+ for (s = je.metric_expr; *s; s++)
620642 *s = tolower(*s);
621643 } else if (json_streq(map, field, "ArchStdEvent")) {
622644 addfield(map, &arch_std, "", "", val);
....@@ -625,7 +647,7 @@
625647 }
626648 /* ignore unknown fields */
627649 }
628
- if (precise && desc && !strstr(desc, "(Precise Event)")) {
650
+ if (precise && je.desc && !strstr(je.desc, "(Precise Event)")) {
629651 if (json_streq(map, precise, "2"))
630652 addfield(map, &extra_desc, " ",
631653 "(Must be precise)", NULL);
....@@ -635,44 +657,44 @@
635657 }
636658 snprintf(buf, sizeof buf, "event=%#llx", eventcode);
637659 addfield(map, &event, ",", buf, NULL);
638
- if (desc && extra_desc)
639
- addfield(map, &desc, " ", extra_desc, NULL);
640
- if (long_desc && extra_desc)
641
- addfield(map, &long_desc, " ", extra_desc, NULL);
660
+ if (je.desc && extra_desc)
661
+ addfield(map, &je.desc, " ", extra_desc, NULL);
662
+ if (je.long_desc && extra_desc)
663
+ addfield(map, &je.long_desc, " ", extra_desc, NULL);
642664 if (filter)
643665 addfield(map, &event, ",", filter, NULL);
644666 if (msr != NULL)
645667 addfield(map, &event, ",", msr->pname, msrval);
646
- if (name)
647
- fixname(name);
668
+ if (je.name)
669
+ fixname(je.name);
648670
649671 if (arch_std) {
650672 /*
651673 * An arch standard event is referenced, so try to
652674 * fixup any unassigned values.
653675 */
654
- err = try_fixup(fn, arch_std, &event, &desc, &name,
655
- &long_desc, &pmu, &filter, &perpkg,
656
- &unit, &metric_expr, &metric_name,
657
- &metric_group, eventcode);
676
+ err = try_fixup(fn, arch_std, &je, &event);
658677 if (err)
659678 goto free_strings;
660679 }
661
- err = func(data, name, real_event(name, event), desc, long_desc,
662
- pmu, unit, perpkg, metric_expr, metric_name, metric_group);
680
+ je.event = real_event(je.name, event);
681
+ err = func(data, &je);
663682 free_strings:
664683 free(event);
665
- free(desc);
666
- free(name);
667
- free(long_desc);
684
+ free(je.desc);
685
+ free(je.name);
686
+ free(je.long_desc);
668687 free(extra_desc);
669
- free(pmu);
688
+ free(je.pmu);
670689 free(filter);
671
- free(perpkg);
672
- free(unit);
673
- free(metric_expr);
674
- free(metric_name);
675
- free(metric_group);
690
+ free(je.perpkg);
691
+ free(je.aggr_mode);
692
+ free(je.deprecated);
693
+ free(je.unit);
694
+ free(je.metric_expr);
695
+ free(je.metric_name);
696
+ free(je.metric_group);
697
+ free(je.metric_constraint);
676698 free(arch_std);
677699
678700 if (err)
....@@ -744,6 +766,19 @@
744766
745767 /* and finally, the closing curly bracket for the struct */
746768 fprintf(outfp, "};\n");
769
+}
770
+
771
+static void print_mapping_test_table(FILE *outfp)
772
+{
773
+ /*
774
+ * Print the terminating, NULL entry.
775
+ */
776
+ fprintf(outfp, "{\n");
777
+ fprintf(outfp, "\t.cpuid = \"testcpu\",\n");
778
+ fprintf(outfp, "\t.version = \"v1\",\n");
779
+ fprintf(outfp, "\t.type = \"core\",\n");
780
+ fprintf(outfp, "\t.table = pme_test_cpu,\n");
781
+ fprintf(outfp, "},\n");
747782 }
748783
749784 static int process_mapfile(FILE *outfp, char *fpath)
....@@ -823,6 +858,7 @@
823858 }
824859
825860 out:
861
+ print_mapping_test_table(outfp);
826862 print_mapping_table_suffix(outfp);
827863 fclose(mapfp);
828864 free(line);
....@@ -847,7 +883,7 @@
847883 _Exit(1);
848884 }
849885
850
- fprintf(outfp, "#include \"../../pmu-events/pmu-events.h\"\n");
886
+ fprintf(outfp, "#include \"pmu-events/pmu-events.h\"\n");
851887 print_mapping_table_prefix(outfp);
852888 print_mapping_table_suffix(outfp);
853889 fclose(outfp);
....@@ -1064,12 +1100,13 @@
10641100 */
10651101 int main(int argc, char *argv[])
10661102 {
1067
- int rc, ret = 0;
1103
+ int rc, ret = 0, empty_map = 0;
10681104 int maxfds;
10691105 char ldirname[PATH_MAX];
10701106 const char *arch;
10711107 const char *output_file;
10721108 const char *start_dirname;
1109
+ char *err_string_ext = "";
10731110 struct stat stbuf;
10741111
10751112 prog = basename(argv[0]);
....@@ -1097,11 +1134,12 @@
10971134 /* If architecture does not have any event lists, bail out */
10981135 if (stat(ldirname, &stbuf) < 0) {
10991136 pr_info("%s: Arch %s has no PMU event lists\n", prog, arch);
1100
- goto empty_map;
1137
+ empty_map = 1;
1138
+ goto err_close_eventsfp;
11011139 }
11021140
11031141 /* Include pmu-events.h first */
1104
- fprintf(eventsfp, "#include \"../../pmu-events/pmu-events.h\"\n");
1142
+ fprintf(eventsfp, "#include \"pmu-events/pmu-events.h\"\n");
11051143
11061144 /*
11071145 * The mapfile allows multiple CPUids to point to the same JSON file,
....@@ -1114,59 +1152,60 @@
11141152 */
11151153
11161154 maxfds = get_maxfds();
1117
- mapfile = NULL;
11181155 rc = nftw(ldirname, preprocess_arch_std_files, maxfds, 0);
1119
- if (rc && verbose) {
1120
- pr_info("%s: Error preprocessing arch standard files %s\n",
1121
- prog, ldirname);
1122
- goto empty_map;
1123
- } else if (rc < 0) {
1124
- /* Make build fail */
1125
- fclose(eventsfp);
1126
- free_arch_std_events();
1127
- return 1;
1128
- } else if (rc) {
1129
- goto empty_map;
1130
- }
1156
+ if (rc)
1157
+ goto err_processing_std_arch_event_dir;
11311158
11321159 rc = nftw(ldirname, process_one_file, maxfds, 0);
1133
- if (rc && verbose) {
1134
- pr_info("%s: Error walking file tree %s\n", prog, ldirname);
1135
- goto empty_map;
1136
- } else if (rc < 0) {
1137
- /* Make build fail */
1138
- fclose(eventsfp);
1139
- free_arch_std_events();
1140
- ret = 1;
1141
- goto out_free_mapfile;
1142
- } else if (rc) {
1143
- goto empty_map;
1144
- }
1160
+ if (rc)
1161
+ goto err_processing_dir;
1162
+
1163
+ sprintf(ldirname, "%s/test", start_dirname);
1164
+
1165
+ rc = nftw(ldirname, process_one_file, maxfds, 0);
1166
+ if (rc)
1167
+ goto err_processing_dir;
11451168
11461169 if (close_table)
11471170 print_events_table_suffix(eventsfp);
11481171
11491172 if (!mapfile) {
11501173 pr_info("%s: No CPU->JSON mapping?\n", prog);
1151
- goto empty_map;
1174
+ empty_map = 1;
1175
+ goto err_close_eventsfp;
11521176 }
11531177
1154
- if (process_mapfile(eventsfp, mapfile)) {
1178
+ rc = process_mapfile(eventsfp, mapfile);
1179
+ fclose(eventsfp);
1180
+ if (rc) {
11551181 pr_info("%s: Error processing mapfile %s\n", prog, mapfile);
11561182 /* Make build fail */
1157
- fclose(eventsfp);
1158
- free_arch_std_events();
11591183 ret = 1;
1184
+ goto err_out;
11601185 }
11611186
1162
-
1163
- goto out_free_mapfile;
1164
-
1165
-empty_map:
1166
- fclose(eventsfp);
1167
- create_empty_mapping(output_file);
11681187 free_arch_std_events();
1169
-out_free_mapfile:
1188
+ free(mapfile);
1189
+ return 0;
1190
+
1191
+err_processing_std_arch_event_dir:
1192
+ err_string_ext = " for std arch event";
1193
+err_processing_dir:
1194
+ if (verbose) {
1195
+ pr_info("%s: Error walking file tree %s%s\n", prog, ldirname,
1196
+ err_string_ext);
1197
+ empty_map = 1;
1198
+ } else if (rc < 0) {
1199
+ ret = 1;
1200
+ } else {
1201
+ empty_map = 1;
1202
+ }
1203
+err_close_eventsfp:
1204
+ fclose(eventsfp);
1205
+ if (empty_map)
1206
+ create_empty_mapping(output_file);
1207
+err_out:
1208
+ free_arch_std_events();
11701209 free(mapfile);
11711210 return ret;
11721211 }