perf list: Hide deprecated events by default
authorJin Yao <yao.jin@linux.intel.com>
Tue, 15 Oct 2019 02:53:57 +0000 (10:53 +0800)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Sat, 19 Oct 2019 18:35:01 +0000 (15:35 -0300)
There are some deprecated events listed by perf list. But we can't
remove them from perf list with ease because some old scripts may use
them.

Deprecated events are old names of renamed events.  When an event gets
renamed the old name is kept around for some time and marked with
Deprecated. The newer Intel event lists in the tree already have these
headers.

So we need to keep them in the event list, but provide a new option to
show them. The new option is "--deprecated".

With this patch, the deprecated events are hidden by default but they
can be displayed when option "--deprecated" is enabled.

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jin Yao <yao.jin@intel.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20191015025357.8708-1-yao.jin@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-list.txt
tools/perf/builtin-list.c
tools/perf/pmu-events/jevents.c
tools/perf/pmu-events/jevents.h
tools/perf/pmu-events/pmu-events.h
tools/perf/util/parse-events.c
tools/perf/util/parse-events.h
tools/perf/util/pmu.c
tools/perf/util/pmu.h

index 18ed1b0fceb33e4f9042ef6ec9ad1445c039e943..6345db33c533961ea7f92fea0b8aa3dd5abd4a55 100644 (file)
@@ -36,6 +36,9 @@ Enable debugging output.
 Print how named events are resolved internally into perf events, and also
 any extra expressions computed by perf stat.
 
+--deprecated::
+Print deprecated events. By default the deprecated events are hidden.
+
 [[EVENT_MODIFIERS]]
 EVENT MODIFIERS
 ---------------
index 08e62ae9d37ed6b3ec5c8f82ddbaa10fd2317fdd..965ef017496fa2a9588776eca160307c7042b404 100644 (file)
@@ -26,6 +26,7 @@ int cmd_list(int argc, const char **argv)
        int i;
        bool raw_dump = false;
        bool long_desc_flag = false;
+       bool deprecated = false;
        struct option list_options[] = {
                OPT_BOOLEAN(0, "raw-dump", &raw_dump, "Dump raw events"),
                OPT_BOOLEAN('d', "desc", &desc_flag,
@@ -34,6 +35,8 @@ int cmd_list(int argc, const char **argv)
                            "Print longer event descriptions."),
                OPT_BOOLEAN(0, "details", &details_flag,
                            "Print information on the perf event names and expressions used internally by events."),
+               OPT_BOOLEAN(0, "deprecated", &deprecated,
+                           "Print deprecated events."),
                OPT_INCR(0, "debug", &verbose,
                             "Enable debugging output"),
                OPT_END()
@@ -55,7 +58,7 @@ int cmd_list(int argc, const char **argv)
 
        if (argc == 0) {
                print_events(NULL, raw_dump, !desc_flag, long_desc_flag,
-                               details_flag);
+                               details_flag, deprecated);
                return 0;
        }
 
@@ -78,7 +81,8 @@ int cmd_list(int argc, const char **argv)
                        print_hwcache_events(NULL, raw_dump);
                else if (strcmp(argv[i], "pmu") == 0)
                        print_pmu_events(NULL, raw_dump, !desc_flag,
-                                               long_desc_flag, details_flag);
+                                               long_desc_flag, details_flag,
+                                               deprecated);
                else if (strcmp(argv[i], "sdt") == 0)
                        print_sdt_events(NULL, NULL, raw_dump);
                else if (strcmp(argv[i], "metric") == 0 || strcmp(argv[i], "metrics") == 0)
@@ -91,7 +95,8 @@ int cmd_list(int argc, const char **argv)
                        if (sep == NULL) {
                                print_events(argv[i], raw_dump, !desc_flag,
                                                        long_desc_flag,
-                                                       details_flag);
+                                                       details_flag,
+                                                       deprecated);
                                continue;
                        }
                        sep_idx = sep - argv[i];
@@ -117,7 +122,8 @@ int cmd_list(int argc, const char **argv)
                        print_hwcache_events(s, raw_dump);
                        print_pmu_events(s, raw_dump, !desc_flag,
                                                long_desc_flag,
-                                               details_flag);
+                                               details_flag,
+                                               deprecated);
                        print_tracepoint_events(NULL, s, raw_dump);
                        print_sdt_events(NULL, s, raw_dump);
                        metricgroup__print(true, true, s, raw_dump, details_flag);
index e2837260ca4df923e9fbb276a24e5f5e30d3d13a..7d69727f44bd5bda3c9b1c69f8f53e55533a7216 100644 (file)
@@ -322,7 +322,8 @@ static int print_events_table_entry(void *data, char *name, char *event,
                                    char *desc, char *long_desc,
                                    char *pmu, char *unit, char *perpkg,
                                    char *metric_expr,
-                                   char *metric_name, char *metric_group)
+                                   char *metric_name, char *metric_group,
+                                   char *deprecated)
 {
        struct perf_entry_data *pd = data;
        FILE *outfp = pd->outfp;
@@ -354,6 +355,8 @@ static int print_events_table_entry(void *data, char *name, char *event,
                fprintf(outfp, "\t.metric_name = \"%s\",\n", metric_name);
        if (metric_group)
                fprintf(outfp, "\t.metric_group = \"%s\",\n", metric_group);
+       if (deprecated)
+               fprintf(outfp, "\t.deprecated = \"%s\",\n", deprecated);
        fprintf(outfp, "},\n");
 
        return 0;
@@ -371,6 +374,7 @@ struct event_struct {
        char *metric_expr;
        char *metric_name;
        char *metric_group;
+       char *deprecated;
 };
 
 #define ADD_EVENT_FIELD(field) do { if (field) {               \
@@ -398,6 +402,7 @@ struct event_struct {
        op(metric_expr);                                        \
        op(metric_name);                                        \
        op(metric_group);                                       \
+       op(deprecated);                                         \
 } while (0)
 
 static LIST_HEAD(arch_std_events);
@@ -416,7 +421,8 @@ static void free_arch_std_events(void)
 static int save_arch_std_events(void *data, char *name, char *event,
                                char *desc, char *long_desc, char *pmu,
                                char *unit, char *perpkg, char *metric_expr,
-                               char *metric_name, char *metric_group)
+                               char *metric_name, char *metric_group,
+                               char *deprecated)
 {
        struct event_struct *es;
 
@@ -479,7 +485,8 @@ static int
 try_fixup(const char *fn, char *arch_std, char **event, char **desc,
          char **name, char **long_desc, char **pmu, char **filter,
          char **perpkg, char **unit, char **metric_expr, char **metric_name,
-         char **metric_group, unsigned long long eventcode)
+         char **metric_group, unsigned long long eventcode,
+         char **deprecated)
 {
        /* try to find matching event from arch standard values */
        struct event_struct *es;
@@ -507,7 +514,8 @@ int json_events(const char *fn,
                      char *long_desc,
                      char *pmu, char *unit, char *perpkg,
                      char *metric_expr,
-                     char *metric_name, char *metric_group),
+                     char *metric_name, char *metric_group,
+                     char *deprecated),
          void *data)
 {
        int err;
@@ -536,6 +544,7 @@ int json_events(const char *fn,
                char *metric_expr = NULL;
                char *metric_name = NULL;
                char *metric_group = NULL;
+               char *deprecated = NULL;
                char *arch_std = NULL;
                unsigned long long eventcode = 0;
                struct msrmap *msr = NULL;
@@ -614,6 +623,8 @@ int json_events(const char *fn,
                                addfield(map, &unit, "", "", val);
                        } else if (json_streq(map, field, "PerPkg")) {
                                addfield(map, &perpkg, "", "", val);
+                       } else if (json_streq(map, field, "Deprecated")) {
+                               addfield(map, &deprecated, "", "", val);
                        } else if (json_streq(map, field, "MetricName")) {
                                addfield(map, &metric_name, "", "", val);
                        } else if (json_streq(map, field, "MetricGroup")) {
@@ -658,12 +669,14 @@ int json_events(const char *fn,
                        err = try_fixup(fn, arch_std, &event, &desc, &name,
                                        &long_desc, &pmu, &filter, &perpkg,
                                        &unit, &metric_expr, &metric_name,
-                                       &metric_group, eventcode);
+                                       &metric_group, eventcode,
+                                       &deprecated);
                        if (err)
                                goto free_strings;
                }
                err = func(data, name, real_event(name, event), desc, long_desc,
-                          pmu, unit, perpkg, metric_expr, metric_name, metric_group);
+                          pmu, unit, perpkg, metric_expr, metric_name,
+                          metric_group, deprecated);
 free_strings:
                free(event);
                free(desc);
@@ -673,6 +686,7 @@ free_strings:
                free(pmu);
                free(filter);
                free(perpkg);
+               free(deprecated);
                free(unit);
                free(metric_expr);
                free(metric_name);
index 4684c673c445798b956a1509b7a84735d89ceaf7..5cda49a421436d43e162dc04e36287a627ab5830 100644 (file)
@@ -7,7 +7,8 @@ int json_events(const char *fn,
                                char *long_desc,
                                char *pmu,
                                char *unit, char *perpkg, char *metric_expr,
-                               char *metric_name, char *metric_group),
+                               char *metric_name, char *metric_group,
+                               char *deprecated),
                void *data);
 char *get_cpu_str(void);
 
index 92a4d15ee0b9d8ad8d2adb7fb6422fc98ebbfc5c..caeb577d36c98ded8e92908ced695b092eb16eb6 100644 (file)
@@ -17,6 +17,7 @@ struct pmu_event {
        const char *metric_expr;
        const char *metric_name;
        const char *metric_group;
+       const char *deprecated;
 };
 
 /*
index b5e2adef49de9683ecf7dadead002ef6eaf0901a..db882f630f7e8e6bb7993bfb883e79b4e61c88f8 100644 (file)
@@ -2600,7 +2600,7 @@ out_enomem:
  * Print the help text for the event symbols:
  */
 void print_events(const char *event_glob, bool name_only, bool quiet_flag,
-                       bool long_desc, bool details_flag)
+                       bool long_desc, bool details_flag, bool deprecated)
 {
        print_symbol_events(event_glob, PERF_TYPE_HARDWARE,
                            event_symbols_hw, PERF_COUNT_HW_MAX, name_only);
@@ -2612,7 +2612,7 @@ void print_events(const char *event_glob, bool name_only, bool quiet_flag,
        print_hwcache_events(event_glob, name_only);
 
        print_pmu_events(event_glob, name_only, quiet_flag, long_desc,
-                       details_flag);
+                       details_flag, deprecated);
 
        if (event_glob != NULL)
                return;
index 616ca1eda0eb335d42875776df7c5e7b9ef395ba..769e07cddaa278b6a1170eb337845caddbd1e437 100644 (file)
@@ -195,7 +195,7 @@ void parse_events_evlist_error(struct parse_events_state *parse_state,
                               int idx, const char *str);
 
 void print_events(const char *event_glob, bool name_only, bool quiet,
-                 bool long_desc, bool details_flag);
+                 bool long_desc, bool details_flag, bool deprecated);
 
 struct event_symbol {
        const char      *symbol;
index 5608da82ad2398e88e27167f25eaa96ca8e489da..adbe97e941dd73fec7108ba7c5f9d89c018f26db 100644 (file)
@@ -308,7 +308,8 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
                                 char *long_desc, char *topic,
                                 char *unit, char *perpkg,
                                 char *metric_expr,
-                                char *metric_name)
+                                char *metric_name,
+                                char *deprecated)
 {
        struct parse_events_term *term;
        struct perf_pmu_alias *alias;
@@ -325,6 +326,7 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
        alias->unit[0] = '\0';
        alias->per_pkg = false;
        alias->snapshot = false;
+       alias->deprecated = false;
 
        ret = parse_events_terms(&alias->terms, val);
        if (ret) {
@@ -379,6 +381,9 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
        alias->per_pkg = perpkg && sscanf(perpkg, "%d", &num) == 1 && num == 1;
        alias->str = strdup(newval);
 
+       if (deprecated)
+               alias->deprecated = true;
+
        if (!perf_pmu_merge_alias(alias, list))
                list_add_tail(&alias->list, list);
 
@@ -400,7 +405,7 @@ static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FI
        strim(buf);
 
        return __perf_pmu__new_alias(list, dir, name, NULL, buf, NULL, NULL, NULL,
-                                    NULL, NULL, NULL);
+                                    NULL, NULL, NULL, NULL);
 }
 
 static inline bool pmu_alias_info_file(char *name)
@@ -787,7 +792,8 @@ new_alias:
                                (char *)pe->long_desc, (char *)pe->topic,
                                (char *)pe->unit, (char *)pe->perpkg,
                                (char *)pe->metric_expr,
-                               (char *)pe->metric_name);
+                               (char *)pe->metric_name,
+                               (char *)pe->deprecated);
        }
 }
 
@@ -1383,7 +1389,7 @@ static void wordwrap(char *s, int start, int max, int corr)
 }
 
 void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag,
-                       bool long_desc, bool details_flag)
+                       bool long_desc, bool details_flag, bool deprecated)
 {
        struct perf_pmu *pmu;
        struct perf_pmu_alias *alias;
@@ -1414,6 +1420,9 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag,
                                format_alias(buf, sizeof(buf), pmu, alias);
                        bool is_cpu = !strcmp(pmu->name, "cpu");
 
+                       if (alias->deprecated && !deprecated)
+                               continue;
+
                        if (event_glob != NULL &&
                            !(strglobmatch_nocase(name, event_glob) ||
                              (!is_cpu && strglobmatch_nocase(alias->name,
index f36ade6df76d1c3c32a82e7140c4a98c9f036727..3e8cd31a89ccbd67bd672bffb2b9861c2834296e 100644 (file)
@@ -57,6 +57,7 @@ struct perf_pmu_alias {
        double scale;
        bool per_pkg;
        bool snapshot;
+       bool deprecated;
        char *metric_expr;
        char *metric_name;
 };
@@ -85,7 +86,8 @@ int perf_pmu__format_parse(char *dir, struct list_head *head);
 struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu);
 
 void print_pmu_events(const char *event_glob, bool name_only, bool quiet,
-                     bool long_desc, bool details_flag);
+                     bool long_desc, bool details_flag,
+                     bool deprecated);
 bool pmu_have_event(const char *pname, const char *name);
 
 int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt, ...) __scanf(3, 4);