diff options
| -rw-r--r-- | tools/perf/pmu-events/jevents.c | 14 | ||||
| -rw-r--r-- | tools/perf/pmu-events/jevents.h | 3 | ||||
| -rw-r--r-- | tools/perf/pmu-events/pmu-events.h | 1 | ||||
| -rw-r--r-- | tools/perf/util/evsel.c | 1 | ||||
| -rw-r--r-- | tools/perf/util/evsel.h | 1 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.c | 1 | ||||
| -rw-r--r-- | tools/perf/util/pmu.c | 15 | ||||
| -rw-r--r-- | tools/perf/util/pmu.h | 2 | ||||
| -rw-r--r-- | tools/perf/util/stat-shadow.c | 4 |
9 files changed, 34 insertions, 8 deletions
diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c index 0735dc2a167a..81f2ef3b15cf 100644 --- a/tools/perf/pmu-events/jevents.c +++ b/tools/perf/pmu-events/jevents.c | |||
| @@ -292,7 +292,8 @@ static void print_events_table_prefix(FILE *fp, const char *tblname) | |||
| 292 | static int print_events_table_entry(void *data, char *name, char *event, | 292 | static int print_events_table_entry(void *data, char *name, char *event, |
| 293 | char *desc, char *long_desc, | 293 | char *desc, char *long_desc, |
| 294 | char *pmu, char *unit, char *perpkg, | 294 | char *pmu, char *unit, char *perpkg, |
| 295 | char *metric_expr) | 295 | char *metric_expr, |
| 296 | char *metric_name) | ||
| 296 | { | 297 | { |
| 297 | struct perf_entry_data *pd = data; | 298 | struct perf_entry_data *pd = data; |
| 298 | FILE *outfp = pd->outfp; | 299 | FILE *outfp = pd->outfp; |
| @@ -318,6 +319,8 @@ static int print_events_table_entry(void *data, char *name, char *event, | |||
| 318 | fprintf(outfp, "\t.perpkg = \"%s\",\n", perpkg); | 319 | fprintf(outfp, "\t.perpkg = \"%s\",\n", perpkg); |
| 319 | if (metric_expr) | 320 | if (metric_expr) |
| 320 | fprintf(outfp, "\t.metric_expr = \"%s\",\n", metric_expr); | 321 | fprintf(outfp, "\t.metric_expr = \"%s\",\n", metric_expr); |
| 322 | if (metric_name) | ||
| 323 | fprintf(outfp, "\t.metric_name = \"%s\",\n", metric_name); | ||
| 321 | fprintf(outfp, "},\n"); | 324 | fprintf(outfp, "},\n"); |
| 322 | 325 | ||
| 323 | return 0; | 326 | return 0; |
| @@ -366,7 +369,8 @@ int json_events(const char *fn, | |||
| 366 | int (*func)(void *data, char *name, char *event, char *desc, | 369 | int (*func)(void *data, char *name, char *event, char *desc, |
| 367 | char *long_desc, | 370 | char *long_desc, |
| 368 | char *pmu, char *unit, char *perpkg, | 371 | char *pmu, char *unit, char *perpkg, |
| 369 | char *metric_expr), | 372 | char *metric_expr, |
| 373 | char *metric_name), | ||
| 370 | void *data) | 374 | void *data) |
| 371 | { | 375 | { |
| 372 | int err = -EIO; | 376 | int err = -EIO; |
| @@ -393,6 +397,7 @@ int json_events(const char *fn, | |||
| 393 | char *perpkg = NULL; | 397 | char *perpkg = NULL; |
| 394 | char *unit = NULL; | 398 | char *unit = NULL; |
| 395 | char *metric_expr = NULL; | 399 | char *metric_expr = NULL; |
| 400 | char *metric_name = NULL; | ||
| 396 | unsigned long long eventcode = 0; | 401 | unsigned long long eventcode = 0; |
| 397 | struct msrmap *msr = NULL; | 402 | struct msrmap *msr = NULL; |
| 398 | jsmntok_t *msrval = NULL; | 403 | jsmntok_t *msrval = NULL; |
| @@ -469,6 +474,8 @@ int json_events(const char *fn, | |||
| 469 | addfield(map, &unit, "", "", val); | 474 | addfield(map, &unit, "", "", val); |
| 470 | } else if (json_streq(map, field, "PerPkg")) { | 475 | } else if (json_streq(map, field, "PerPkg")) { |
| 471 | addfield(map, &perpkg, "", "", val); | 476 | addfield(map, &perpkg, "", "", val); |
| 477 | } else if (json_streq(map, field, "MetricName")) { | ||
| 478 | addfield(map, &metric_name, "", "", val); | ||
| 472 | } else if (json_streq(map, field, "MetricExpr")) { | 479 | } else if (json_streq(map, field, "MetricExpr")) { |
| 473 | addfield(map, &metric_expr, "", "", val); | 480 | addfield(map, &metric_expr, "", "", val); |
| 474 | for (s = metric_expr; *s; s++) | 481 | for (s = metric_expr; *s; s++) |
| @@ -497,7 +504,7 @@ int json_events(const char *fn, | |||
| 497 | fixname(name); | 504 | fixname(name); |
| 498 | 505 | ||
| 499 | err = func(data, name, real_event(name, event), desc, long_desc, | 506 | err = func(data, name, real_event(name, event), desc, long_desc, |
| 500 | pmu, unit, perpkg, metric_expr); | 507 | pmu, unit, perpkg, metric_expr, metric_name); |
| 501 | free(event); | 508 | free(event); |
| 502 | free(desc); | 509 | free(desc); |
| 503 | free(name); | 510 | free(name); |
| @@ -508,6 +515,7 @@ int json_events(const char *fn, | |||
| 508 | free(perpkg); | 515 | free(perpkg); |
| 509 | free(unit); | 516 | free(unit); |
| 510 | free(metric_expr); | 517 | free(metric_expr); |
| 518 | free(metric_name); | ||
| 511 | if (err) | 519 | if (err) |
| 512 | break; | 520 | break; |
| 513 | tok += j; | 521 | tok += j; |
diff --git a/tools/perf/pmu-events/jevents.h b/tools/perf/pmu-events/jevents.h index 57e111bf2168..611fac01913d 100644 --- a/tools/perf/pmu-events/jevents.h +++ b/tools/perf/pmu-events/jevents.h | |||
| @@ -5,7 +5,8 @@ int json_events(const char *fn, | |||
| 5 | int (*func)(void *data, char *name, char *event, char *desc, | 5 | int (*func)(void *data, char *name, char *event, char *desc, |
| 6 | char *long_desc, | 6 | char *long_desc, |
| 7 | char *pmu, | 7 | char *pmu, |
| 8 | char *unit, char *perpkg, char *metric_expr), | 8 | char *unit, char *perpkg, char *metric_expr, |
| 9 | char *metric_name), | ||
| 9 | void *data); | 10 | void *data); |
| 10 | char *get_cpu_str(void); | 11 | char *get_cpu_str(void); |
| 11 | 12 | ||
diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu-events.h index d046e3a4ce46..569eab3688dd 100644 --- a/tools/perf/pmu-events/pmu-events.h +++ b/tools/perf/pmu-events/pmu-events.h | |||
| @@ -14,6 +14,7 @@ struct pmu_event { | |||
| 14 | const char *unit; | 14 | const char *unit; |
| 15 | const char *perpkg; | 15 | const char *perpkg; |
| 16 | const char *metric_expr; | 16 | const char *metric_expr; |
| 17 | const char *metric_name; | ||
| 17 | }; | 18 | }; |
| 18 | 19 | ||
| 19 | /* | 20 | /* |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index ef2a31f6dd06..9dc7e2d6e48a 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
| @@ -237,6 +237,7 @@ void perf_evsel__init(struct perf_evsel *evsel, | |||
| 237 | perf_evsel__calc_id_pos(evsel); | 237 | perf_evsel__calc_id_pos(evsel); |
| 238 | evsel->cmdline_group_boundary = false; | 238 | evsel->cmdline_group_boundary = false; |
| 239 | evsel->metric_expr = NULL; | 239 | evsel->metric_expr = NULL; |
| 240 | evsel->metric_name = NULL; | ||
| 240 | evsel->metric_events = NULL; | 241 | evsel->metric_events = NULL; |
| 241 | evsel->collect_stat = false; | 242 | evsel->collect_stat = false; |
| 242 | } | 243 | } |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 8f1f61826fdf..d101695c482c 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
| @@ -133,6 +133,7 @@ struct perf_evsel { | |||
| 133 | int bpf_fd; | 133 | int bpf_fd; |
| 134 | bool merged_stat; | 134 | bool merged_stat; |
| 135 | const char * metric_expr; | 135 | const char * metric_expr; |
| 136 | const char * metric_name; | ||
| 136 | struct perf_evsel **metric_events; | 137 | struct perf_evsel **metric_events; |
| 137 | bool collect_stat; | 138 | bool collect_stat; |
| 138 | }; | 139 | }; |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 91b8e83e307d..119eb0b65876 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
| @@ -1256,6 +1256,7 @@ int parse_events_add_pmu(struct parse_events_evlist *data, | |||
| 1256 | evsel->per_pkg = info.per_pkg; | 1256 | evsel->per_pkg = info.per_pkg; |
| 1257 | evsel->snapshot = info.snapshot; | 1257 | evsel->snapshot = info.snapshot; |
| 1258 | evsel->metric_expr = info.metric_expr; | 1258 | evsel->metric_expr = info.metric_expr; |
| 1259 | evsel->metric_name = info.metric_name; | ||
| 1259 | } | 1260 | } |
| 1260 | 1261 | ||
| 1261 | return evsel ? 0 : -ENOMEM; | 1262 | return evsel ? 0 : -ENOMEM; |
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index f819ad162b7c..bcf752fa345b 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c | |||
| @@ -232,7 +232,8 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name, | |||
| 232 | char *desc, char *val, | 232 | char *desc, char *val, |
| 233 | char *long_desc, char *topic, | 233 | char *long_desc, char *topic, |
| 234 | char *unit, char *perpkg, | 234 | char *unit, char *perpkg, |
| 235 | char *metric_expr) | 235 | char *metric_expr, |
| 236 | char *metric_name) | ||
| 236 | { | 237 | { |
| 237 | struct perf_pmu_alias *alias; | 238 | struct perf_pmu_alias *alias; |
| 238 | int ret; | 239 | int ret; |
| @@ -267,6 +268,7 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name, | |||
| 267 | } | 268 | } |
| 268 | 269 | ||
| 269 | alias->metric_expr = metric_expr ? strdup(metric_expr) : NULL; | 270 | alias->metric_expr = metric_expr ? strdup(metric_expr) : NULL; |
| 271 | alias->metric_name = metric_name ? strdup(metric_name): NULL; | ||
| 270 | alias->desc = desc ? strdup(desc) : NULL; | 272 | alias->desc = desc ? strdup(desc) : NULL; |
| 271 | alias->long_desc = long_desc ? strdup(long_desc) : | 273 | alias->long_desc = long_desc ? strdup(long_desc) : |
| 272 | desc ? strdup(desc) : NULL; | 274 | desc ? strdup(desc) : NULL; |
| @@ -296,7 +298,7 @@ static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FI | |||
| 296 | buf[ret] = 0; | 298 | buf[ret] = 0; |
| 297 | 299 | ||
| 298 | return __perf_pmu__new_alias(list, dir, name, NULL, buf, NULL, NULL, NULL, | 300 | return __perf_pmu__new_alias(list, dir, name, NULL, buf, NULL, NULL, NULL, |
| 299 | NULL, NULL); | 301 | NULL, NULL, NULL); |
| 300 | } | 302 | } |
| 301 | 303 | ||
| 302 | static inline bool pmu_alias_info_file(char *name) | 304 | static inline bool pmu_alias_info_file(char *name) |
| @@ -567,7 +569,8 @@ static void pmu_add_cpu_aliases(struct list_head *head, const char *name) | |||
| 567 | (char *)pe->desc, (char *)pe->event, | 569 | (char *)pe->desc, (char *)pe->event, |
| 568 | (char *)pe->long_desc, (char *)pe->topic, | 570 | (char *)pe->long_desc, (char *)pe->topic, |
| 569 | (char *)pe->unit, (char *)pe->perpkg, | 571 | (char *)pe->unit, (char *)pe->perpkg, |
| 570 | (char *)pe->metric_expr); | 572 | (char *)pe->metric_expr, |
| 573 | (char *)pe->metric_name); | ||
| 571 | } | 574 | } |
| 572 | 575 | ||
| 573 | out: | 576 | out: |
| @@ -995,6 +998,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms, | |||
| 995 | info->scale = 0.0; | 998 | info->scale = 0.0; |
| 996 | info->snapshot = false; | 999 | info->snapshot = false; |
| 997 | info->metric_expr = NULL; | 1000 | info->metric_expr = NULL; |
| 1001 | info->metric_name = NULL; | ||
| 998 | 1002 | ||
| 999 | list_for_each_entry_safe(term, h, head_terms, list) { | 1003 | list_for_each_entry_safe(term, h, head_terms, list) { |
| 1000 | alias = pmu_find_alias(pmu, term); | 1004 | alias = pmu_find_alias(pmu, term); |
| @@ -1011,6 +1015,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms, | |||
| 1011 | if (alias->per_pkg) | 1015 | if (alias->per_pkg) |
| 1012 | info->per_pkg = true; | 1016 | info->per_pkg = true; |
| 1013 | info->metric_expr = alias->metric_expr; | 1017 | info->metric_expr = alias->metric_expr; |
| 1018 | info->metric_name = alias->metric_name; | ||
| 1014 | 1019 | ||
| 1015 | list_del(&term->list); | 1020 | list_del(&term->list); |
| 1016 | free(term); | 1021 | free(term); |
| @@ -1106,6 +1111,7 @@ struct sevent { | |||
| 1106 | char *str; | 1111 | char *str; |
| 1107 | char *pmu; | 1112 | char *pmu; |
| 1108 | char *metric_expr; | 1113 | char *metric_expr; |
| 1114 | char *metric_name; | ||
| 1109 | }; | 1115 | }; |
| 1110 | 1116 | ||
| 1111 | static int cmp_sevent(const void *a, const void *b) | 1117 | static int cmp_sevent(const void *a, const void *b) |
| @@ -1205,6 +1211,7 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag, | |||
| 1205 | aliases[j].str = alias->str; | 1211 | aliases[j].str = alias->str; |
| 1206 | aliases[j].pmu = pmu->name; | 1212 | aliases[j].pmu = pmu->name; |
| 1207 | aliases[j].metric_expr = alias->metric_expr; | 1213 | aliases[j].metric_expr = alias->metric_expr; |
| 1214 | aliases[j].metric_name = alias->metric_name; | ||
| 1208 | j++; | 1215 | j++; |
| 1209 | } | 1216 | } |
| 1210 | if (pmu->selectable && | 1217 | if (pmu->selectable && |
| @@ -1241,6 +1248,8 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag, | |||
| 1241 | printf("]\n"); | 1248 | printf("]\n"); |
| 1242 | if (verbose > 0) { | 1249 | if (verbose > 0) { |
| 1243 | printf("%*s%s/%s/ ", 8, "", aliases[j].pmu, aliases[j].str); | 1250 | printf("%*s%s/%s/ ", 8, "", aliases[j].pmu, aliases[j].str); |
| 1251 | if (aliases[j].metric_name) | ||
| 1252 | printf(" MetricName: %s", aliases[j].metric_name); | ||
| 1244 | if (aliases[j].metric_expr) | 1253 | if (aliases[j].metric_expr) |
| 1245 | printf(" MetricExpr: %s", aliases[j].metric_expr); | 1254 | printf(" MetricExpr: %s", aliases[j].metric_expr); |
| 1246 | putchar('\n'); | 1255 | putchar('\n'); |
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index 27f078ccc594..3d4b703f5d89 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h | |||
| @@ -32,6 +32,7 @@ struct perf_pmu { | |||
| 32 | struct perf_pmu_info { | 32 | struct perf_pmu_info { |
| 33 | const char *unit; | 33 | const char *unit; |
| 34 | const char *metric_expr; | 34 | const char *metric_expr; |
| 35 | const char *metric_name; | ||
| 35 | double scale; | 36 | double scale; |
| 36 | bool per_pkg; | 37 | bool per_pkg; |
| 37 | bool snapshot; | 38 | bool snapshot; |
| @@ -52,6 +53,7 @@ struct perf_pmu_alias { | |||
| 52 | bool per_pkg; | 53 | bool per_pkg; |
| 53 | bool snapshot; | 54 | bool snapshot; |
| 54 | char *metric_expr; | 55 | char *metric_expr; |
| 56 | char *metric_name; | ||
| 55 | }; | 57 | }; |
| 56 | 58 | ||
| 57 | struct perf_pmu *perf_pmu__find(const char *name); | 59 | struct perf_pmu *perf_pmu__find(const char *name); |
diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c index c323cce97d98..ac10cc675d39 100644 --- a/tools/perf/util/stat-shadow.c +++ b/tools/perf/util/stat-shadow.c | |||
| @@ -803,7 +803,9 @@ void perf_stat__print_shadow_stats(struct perf_evsel *evsel, | |||
| 803 | 803 | ||
| 804 | if (expr__parse(&ratio, &pctx, &p) == 0) | 804 | if (expr__parse(&ratio, &pctx, &p) == 0) |
| 805 | print_metric(ctxp, NULL, "%8.1f", | 805 | print_metric(ctxp, NULL, "%8.1f", |
| 806 | out->force_header ? evsel->name : "", | 806 | evsel->metric_name ? |
| 807 | evsel->metric_name : | ||
| 808 | out->force_header ? evsel->name : "", | ||
| 807 | ratio); | 809 | ratio); |
| 808 | else | 810 | else |
| 809 | print_metric(ctxp, NULL, NULL, "", 0); | 811 | print_metric(ctxp, NULL, NULL, "", 0); |
