perf, tools: Improve error messages for missing PMUs
PATCH 1/1 perf, tools: Improve error messages for missing PMUs
From: Andi Kleen <[email protected]>
When a PMU is missing print a better error message mentioning the missing PMU.
% mkdir empty
% mount --bind empty /sys/devices/msr
% perf stat -M Summary true
event syntax error: '{inst_retired.any,cycles}:W,{cpu_clk_unhalted.thread}:W,{inst_retired.any}:W,{cpu_clk_unhalted.ref_tsc,msr/tsc/}:W,{fp_comp_ops_exe.sse_scalar..'
\___ Cannot find PMU `msr'. Missing kernel support?
It still cannot find the right column for aliases, but it's already a vast improvement.
--- tools/perf/util/metricgroup.c | 2 +- tools/perf/util/parse-events.c | 17 +++++++++++------ tools/perf/util/parse-events.h | 3 +++ 3 files changed, 15 insertions(+), 7 deletions(-)
tools/perf/util/metricgroup.c +1 -1
@@ -477,7 +477,7 @@ int metricgroup__parse_groups(const struct option *opt,memset (&parse_error,0 ,sizeof (struct parse_events_error )); ret =parse_events (perf_evlist, extra_events.buf, &parse_error);if (ret) { -pr_err ("Cannot set up events %s\n" , extra_events.buf); +parse_events_print_error (&parse_error, extra_events.buf); goto out; }strbuf_release (&extra_events);
tools/perf/util/parse-events.c +11 -6
@@ -1218,11 +1218,16 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,struct perf_pmu_info info;struct perf_pmu *pmu;struct perf_evsel *evsel; +struct parse_events_error *err = parse_state->error;LIST_HEAD (config_terms); pmu =perf_pmu__find (name); -if (!pmu) +if (!pmu) { + (void )asprintf (&err->str, +"Cannot find PMU `%s'. Missing kernel support?" , + name);return -EINVAL ; + }if (pmu->default_config) { memcpy(&attr, pmu->default_config,
@@ -1725,8 +1730,8 @@ static int get_term_width(void)return ws.ws_col >MAX_WIDTH ?MAX_WIDTH : ws.ws_col; } -static void parse_events_print_error (struct parse_events_error *err, -const char *event) +void parse_events_print_error (struct parse_events_error *err, +const char *event) {const char *str ="invalid or unsupported event: " ;char _buf[MAX_WIDTH ];
@@ -1781,8 +1786,6 @@ static void parse_events_print_error(struct parse_events_error *err,zfree (&err->str);zfree (&err->help); } - -fprintf (stderr,"Run 'perf list' for a list of valid events\n" ); }#undef MAX_WIDTH
@@ -1794,8 +1797,10 @@ int parse_events_option(const struct option *opt, const char *str,struct parse_events_error err = { .idx =0 , };int ret =parse_events (evlist, str, &err); -if (ret) +if (ret) {parse_events_print_error (&err, str); +fprintf (stderr,"Run 'perf list' for a list of valid events\n" ); + }return ret; }
tools/perf/util/parse-events.h +3 -0
@@ -202,6 +202,9 @@ int is_valid_tracepoint(const char *event_string);int valid_event_mount (const char *eventfs);char *parse_events_formats_error_string (char *additional_terms); +void parse_events_print_error (struct parse_events_error *err, +const char *event); +#ifdef HAVE_LIBELF_SUPPORT /* * If the probe point starts with '%',
Signature · 1 line
2.9.5
Arnaldo Carvalho de Melo
maintainerEm Mon, Sep 11, 2017 at 05:26:36PM -0700, Andi Kleen escreveu:
Quoted 5 lines
From: Andi Kleen <[email protected]>
When a PMU is missing print a better error message mentioning the missing PMU.
Quoted 7 lines
% mkdir empty
% mount --bind empty/sys/devices/msr
% perf stat -M Summary true
event syntax error: '{inst_retired.any,cycles}:W,{cpu_clk_unhalted.thread}:W,{inst_retired.any}:W,{cpu_clk_unhalted.ref_tsc,msr/tsc/}:W,{fp_comp_ops_exe.sse_scalar..'
\___ Cannot find PMU `msr'. Missing kernel support?It still cannot find the right column for aliases, but it's already a vast improvement.
CC /tmp/build/perf/util/parse-events.outil/parse-events.c: In function ‘__parse_events_add_pmu’:util/parse-events.c:1227:3: error: ignoring return value of ‘asprintf’, declared with attribute warn_unused_result [-Werror=unused-result]
(void)asprintf(&err->str,
^~~~~~~~~~~~~~~~~~~~~~~~~
"Cannot find PMU `%s'. Missing kernel support?",
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
name);
~~~~~cc1: all warnings being treated as errors
mv: cannot stat '/tmp/build/perf/util/.parse-events.o.tmp': No such file or directory make[4]: *** [/home/acme/git/linux/tools/build/Makefile.build:95: /tmp/build/perf/util/parse-events.o] Error 1 make[3]: *** [/home/acme/git/linux/tools/build/Makefile.build:138: util] Error 2
make[2]: *** [Makefile.perf:595: /tmp/build/perf/libperf-in.o] Error 2
make[1]: *** [Makefile.perf:210: sub-make] Error 2
make: *** [Makefile:109: install-bin] Error 2
make: Leaving directory '/home/acme/git/linux/tools/perf'