Commit c8d6828a authored by Sukadev Bhattiprolu's avatar Sukadev Bhattiprolu Committed by Arnaldo Carvalho de Melo

perf list: Support long jevents descriptions

Previously we were dropping the useful longer descriptions that some
events have in the event list completely. This patch makes them appear with
perf list.

Old perf list:

baclears:
  baclears.all
       [Counts the number of baclears]

vs new:

perf list -v:
...
baclears:
  baclears.all
       [The BACLEARS event counts the number of times the front end is
        resteered, mainly when the Branch Prediction Unit cannot provide
        a correct prediction and this is corrected by the Branch Address
        Calculator at the front end. The BACLEARS.ANY event counts the
        number of baclears for any type of branch]
Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
Signed-off-by: default avatarSukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Acked-by: default avatarIngo Molnar <mingo@kernel.org>
Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
Cc: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lkml.kernel.org/r/1473978296-20712-13-git-send-email-sukadev@linux.vnet.ibm.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 794ba54a
...@@ -8,7 +8,7 @@ perf-list - List all symbolic event types ...@@ -8,7 +8,7 @@ perf-list - List all symbolic event types
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'perf list' [--no-desc] [hw|sw|cache|tracepoint|pmu|event_glob] 'perf list' [--no-desc] [--long-desc] [hw|sw|cache|tracepoint|pmu|event_glob]
DESCRIPTION DESCRIPTION
----------- -----------
...@@ -20,6 +20,10 @@ OPTIONS ...@@ -20,6 +20,10 @@ OPTIONS
--no-desc:: --no-desc::
Don't print descriptions. Don't print descriptions.
-v::
--long-desc::
Print longer event descriptions.
[[EVENT_MODIFIERS]] [[EVENT_MODIFIERS]]
EVENT MODIFIERS EVENT MODIFIERS
......
...@@ -22,14 +22,17 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -22,14 +22,17 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
{ {
int i; int i;
bool raw_dump = false; bool raw_dump = false;
bool long_desc_flag = false;
struct option list_options[] = { struct option list_options[] = {
OPT_BOOLEAN(0, "raw-dump", &raw_dump, "Dump raw events"), OPT_BOOLEAN(0, "raw-dump", &raw_dump, "Dump raw events"),
OPT_BOOLEAN('d', "desc", &desc_flag, OPT_BOOLEAN('d', "desc", &desc_flag,
"Print extra event descriptions. --no-desc to not print."), "Print extra event descriptions. --no-desc to not print."),
OPT_BOOLEAN('v', "long-desc", &long_desc_flag,
"Print longer event descriptions."),
OPT_END() OPT_END()
}; };
const char * const list_usage[] = { const char * const list_usage[] = {
"perf list [--no-desc] [hw|sw|cache|tracepoint|pmu|sdt|event_glob]", "perf list [<options>] [hw|sw|cache|tracepoint|pmu|sdt|event_glob]",
NULL NULL
}; };
...@@ -44,7 +47,7 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -44,7 +47,7 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
printf("\nList of pre-defined events (to be used in -e):\n\n"); printf("\nList of pre-defined events (to be used in -e):\n\n");
if (argc == 0) { if (argc == 0) {
print_events(NULL, raw_dump, !desc_flag); print_events(NULL, raw_dump, !desc_flag, long_desc_flag);
return 0; return 0;
} }
...@@ -65,14 +68,16 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -65,14 +68,16 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
strcmp(argv[i], "hwcache") == 0) strcmp(argv[i], "hwcache") == 0)
print_hwcache_events(NULL, raw_dump); print_hwcache_events(NULL, raw_dump);
else if (strcmp(argv[i], "pmu") == 0) else if (strcmp(argv[i], "pmu") == 0)
print_pmu_events(NULL, raw_dump, !desc_flag); print_pmu_events(NULL, raw_dump, !desc_flag,
long_desc_flag);
else if (strcmp(argv[i], "sdt") == 0) else if (strcmp(argv[i], "sdt") == 0)
print_sdt_events(NULL, NULL, raw_dump); print_sdt_events(NULL, NULL, raw_dump);
else if ((sep = strchr(argv[i], ':')) != NULL) { else if ((sep = strchr(argv[i], ':')) != NULL) {
int sep_idx; int sep_idx;
if (sep == NULL) { if (sep == NULL) {
print_events(argv[i], raw_dump, !desc_flag); print_events(argv[i], raw_dump, !desc_flag,
long_desc_flag);
continue; continue;
} }
sep_idx = sep - argv[i]; sep_idx = sep - argv[i];
...@@ -94,7 +99,8 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -94,7 +99,8 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
print_symbol_events(s, PERF_TYPE_SOFTWARE, print_symbol_events(s, PERF_TYPE_SOFTWARE,
event_symbols_sw, PERF_COUNT_SW_MAX, raw_dump); event_symbols_sw, PERF_COUNT_SW_MAX, raw_dump);
print_hwcache_events(s, raw_dump); print_hwcache_events(s, raw_dump);
print_pmu_events(s, raw_dump, !desc_flag); print_pmu_events(s, raw_dump, !desc_flag,
long_desc_flag);
print_tracepoint_events(NULL, s, raw_dump); print_tracepoint_events(NULL, s, raw_dump);
print_sdt_events(NULL, s, raw_dump); print_sdt_events(NULL, s, raw_dump);
free(s); free(s);
......
...@@ -2263,7 +2263,8 @@ void print_symbol_events(const char *event_glob, unsigned type, ...@@ -2263,7 +2263,8 @@ void print_symbol_events(const char *event_glob, unsigned type,
/* /*
* Print the help text for the event symbols: * Print the help text for the event symbols:
*/ */
void print_events(const char *event_glob, bool name_only, bool quiet_flag) void print_events(const char *event_glob, bool name_only, bool quiet_flag,
bool long_desc)
{ {
print_symbol_events(event_glob, PERF_TYPE_HARDWARE, print_symbol_events(event_glob, PERF_TYPE_HARDWARE,
event_symbols_hw, PERF_COUNT_HW_MAX, name_only); event_symbols_hw, PERF_COUNT_HW_MAX, name_only);
...@@ -2273,7 +2274,7 @@ void print_events(const char *event_glob, bool name_only, bool quiet_flag) ...@@ -2273,7 +2274,7 @@ void print_events(const char *event_glob, bool name_only, bool quiet_flag)
print_hwcache_events(event_glob, name_only); print_hwcache_events(event_glob, name_only);
print_pmu_events(event_glob, name_only, quiet_flag); print_pmu_events(event_glob, name_only, quiet_flag, long_desc);
if (event_glob != NULL) if (event_glob != NULL)
return; return;
......
...@@ -172,7 +172,8 @@ void parse_events_update_lists(struct list_head *list_event, ...@@ -172,7 +172,8 @@ void parse_events_update_lists(struct list_head *list_event,
void parse_events_evlist_error(struct parse_events_evlist *data, void parse_events_evlist_error(struct parse_events_evlist *data,
int idx, const char *str); int idx, const char *str);
void print_events(const char *event_glob, bool name_only, bool quiet); void print_events(const char *event_glob, bool name_only, bool quiet,
bool long_desc);
struct event_symbol { struct event_symbol {
const char *symbol; const char *symbol;
......
...@@ -223,7 +223,7 @@ static int perf_pmu__parse_snapshot(struct perf_pmu_alias *alias, ...@@ -223,7 +223,7 @@ static int perf_pmu__parse_snapshot(struct perf_pmu_alias *alias,
} }
static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name, static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
char *desc, char *val) char *desc, char *val, char *long_desc)
{ {
struct perf_pmu_alias *alias; struct perf_pmu_alias *alias;
int ret; int ret;
...@@ -257,6 +257,8 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name, ...@@ -257,6 +257,8 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
} }
alias->desc = desc ? strdup(desc) : NULL; alias->desc = desc ? strdup(desc) : NULL;
alias->long_desc = long_desc ? strdup(long_desc) :
desc ? strdup(desc) : NULL;
list_add_tail(&alias->list, list); list_add_tail(&alias->list, list);
...@@ -274,7 +276,7 @@ static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FI ...@@ -274,7 +276,7 @@ static int perf_pmu__new_alias(struct list_head *list, char *dir, char *name, FI
buf[ret] = 0; buf[ret] = 0;
return __perf_pmu__new_alias(list, dir, name, NULL, buf); return __perf_pmu__new_alias(list, dir, name, NULL, buf, NULL);
} }
static inline bool pmu_alias_info_file(char *name) static inline bool pmu_alias_info_file(char *name)
...@@ -532,7 +534,8 @@ static void pmu_add_cpu_aliases(struct list_head *head) ...@@ -532,7 +534,8 @@ static void pmu_add_cpu_aliases(struct list_head *head)
/* need type casts to override 'const' */ /* need type casts to override 'const' */
__perf_pmu__new_alias(head, NULL, (char *)pe->name, __perf_pmu__new_alias(head, NULL, (char *)pe->name,
(char *)pe->desc, (char *)pe->event); (char *)pe->desc, (char *)pe->event,
(char *)pe->long_desc);
} }
out: out:
...@@ -1090,7 +1093,8 @@ static void wordwrap(char *s, int start, int max, int corr) ...@@ -1090,7 +1093,8 @@ 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) void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag,
bool long_desc)
{ {
struct perf_pmu *pmu; struct perf_pmu *pmu;
struct perf_pmu_alias *alias; struct perf_pmu_alias *alias;
...@@ -1138,7 +1142,8 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag) ...@@ -1138,7 +1142,8 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag)
if (!aliases[j].name) if (!aliases[j].name)
goto out_enomem; goto out_enomem;
aliases[j].desc = alias->desc; aliases[j].desc = long_desc ? alias->long_desc :
alias->desc;
j++; j++;
} }
if (pmu->selectable && if (pmu->selectable &&
......
...@@ -41,6 +41,7 @@ struct perf_pmu_info { ...@@ -41,6 +41,7 @@ struct perf_pmu_info {
struct perf_pmu_alias { struct perf_pmu_alias {
char *name; char *name;
char *desc; char *desc;
char *long_desc;
struct list_head terms; /* HEAD struct parse_events_term -> list */ struct list_head terms; /* HEAD struct parse_events_term -> list */
struct list_head list; /* ELEM */ struct list_head list; /* ELEM */
char unit[UNIT_MAX_LEN+1]; char unit[UNIT_MAX_LEN+1];
...@@ -72,7 +73,8 @@ int perf_pmu__format_parse(char *dir, struct list_head *head); ...@@ -72,7 +73,8 @@ int perf_pmu__format_parse(char *dir, struct list_head *head);
struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu); struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu);
void print_pmu_events(const char *event_glob, bool name_only, bool quiet); void print_pmu_events(const char *event_glob, bool name_only, bool quiet,
bool long_desc);
bool pmu_have_event(const char *pname, const char *name); 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, int perf_pmu__scan_file(struct perf_pmu *pmu, const char *name, const char *fmt,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment