Commit f2361024 authored by Andi Kleen's avatar Andi Kleen Committed by Arnaldo Carvalho de Melo

perf list: Add debug support for outputing alias string

For debugging and testing it is useful to see the converted alias
string. Add support to perf stat/record and perf list to print the alias
conversion. The text string is saved in the alias structure.  For perf
stat/record it is folded into the normal -v. For perf list -v was taken,
so we use --debug.

Before:

% perf list
...
cache:
  l1d.replacement
       [L1D data line replacements]
  l1d_pend_miss.fb_full
       [Cycles a demand request was blocked due to Fill Buffers inavailability]

After

% perf list --debug
...
cache:
  l1d.replacement
       [L1D data line replacements]
        cpu/umask=0x1,period=2000003,event=0x51/
  l1d_pend_miss.fb_full
       [Cycles a demand request was blocked due to Fill Buffers inavailability]
        cpu/umask=0x2,period=2000003,cmask=1,event=0x48/
Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Link: http://lkml.kernel.org/r/20170128020345.19007-6-andi@firstfloor.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 231bb2aa
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "util/parse-events.h" #include "util/parse-events.h"
#include "util/cache.h" #include "util/cache.h"
#include "util/pmu.h" #include "util/pmu.h"
#include "util/debug.h"
#include <subcmd/parse-options.h> #include <subcmd/parse-options.h>
static bool desc_flag = true; static bool desc_flag = true;
...@@ -29,6 +30,8 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -29,6 +30,8 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
"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, OPT_BOOLEAN('v', "long-desc", &long_desc_flag,
"Print longer event descriptions."), "Print longer event descriptions."),
OPT_INCR(0, "debug", &verbose,
"Enable debugging output"),
OPT_END() OPT_END()
}; };
const char * const list_usage[] = { const char * const list_usage[] = {
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/types.h> #include <linux/types.h>
#include "util.h" #include "util.h"
#include "pmu.h" #include "pmu.h"
#include "debug.h"
#include "parse-events.h" #include "parse-events.h"
#include "parse-events-bison.h" #include "parse-events-bison.h"
...@@ -254,6 +255,8 @@ PE_KERNEL_PMU_EVENT sep_dc ...@@ -254,6 +255,8 @@ PE_KERNEL_PMU_EVENT sep_dc
if (!parse_events_add_pmu(data, list, if (!parse_events_add_pmu(data, list,
pmu->name, head)) { pmu->name, head)) {
pr_debug("%s -> %s/%s/\n", $1,
pmu->name, alias->str);
ok++; ok++;
} }
......
...@@ -275,6 +275,8 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name, ...@@ -275,6 +275,8 @@ static int __perf_pmu__new_alias(struct list_head *list, char *dir, char *name,
snprintf(alias->unit, sizeof(alias->unit), "%s", unit); snprintf(alias->unit, sizeof(alias->unit), "%s", unit);
} }
alias->per_pkg = perpkg && sscanf(perpkg, "%d", &num) == 1 && num == 1; alias->per_pkg = perpkg && sscanf(perpkg, "%d", &num) == 1 && num == 1;
alias->str = strdup(val);
list_add_tail(&alias->list, list); list_add_tail(&alias->list, list);
return 0; return 0;
...@@ -1087,6 +1089,8 @@ struct sevent { ...@@ -1087,6 +1089,8 @@ struct sevent {
char *name; char *name;
char *desc; char *desc;
char *topic; char *topic;
char *str;
char *pmu;
}; };
static int cmp_sevent(const void *a, const void *b) static int cmp_sevent(const void *a, const void *b)
...@@ -1183,6 +1187,8 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag, ...@@ -1183,6 +1187,8 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag,
aliases[j].desc = long_desc ? alias->long_desc : aliases[j].desc = long_desc ? alias->long_desc :
alias->desc; alias->desc;
aliases[j].topic = alias->topic; aliases[j].topic = alias->topic;
aliases[j].str = alias->str;
aliases[j].pmu = pmu->name;
j++; j++;
} }
if (pmu->selectable && if (pmu->selectable &&
...@@ -1217,6 +1223,8 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag, ...@@ -1217,6 +1223,8 @@ void print_pmu_events(const char *event_glob, bool name_only, bool quiet_flag,
printf("%*s", 8, "["); printf("%*s", 8, "[");
wordwrap(aliases[j].desc, 8, columns, 0); wordwrap(aliases[j].desc, 8, columns, 0);
printf("]\n"); printf("]\n");
if (verbose)
printf("%*s%s/%s/\n", 8, "", aliases[j].pmu, aliases[j].str);
} else } else
printf(" %-50s [Kernel PMU event]\n", aliases[j].name); printf(" %-50s [Kernel PMU event]\n", aliases[j].name);
printed++; printed++;
......
...@@ -43,6 +43,7 @@ struct perf_pmu_alias { ...@@ -43,6 +43,7 @@ struct perf_pmu_alias {
char *desc; char *desc;
char *long_desc; char *long_desc;
char *topic; char *topic;
char *str;
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];
......
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