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.
v2: Check asprintf
--- tools/perf/util/metricgroup.c | 2 +- tools/perf/util/parse-events.c | 18 ++++++++++++------ tools/perf/util/parse-events.h | 3 +++ 3 files changed, 16 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 +12 -6
@@ -1218,11 +1218,17 @@ 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) { +if (asprintf (&err->str, +"Cannot find PMU `%s'. Missing kernel support?" , + name) <0 ) + err->str =NULL ;return -EINVAL ; + }if (pmu->default_config) { memcpy(&attr, pmu->default_config,
@@ -1725,8 +1731,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 +1787,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 +1798,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
Quoted 26 lines · Andi Kleen
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.
v2: Check asprintf
Signed-off-by Andi Kleen <[email protected]>--- tools/perf/util/metricgroup.c | 2 +- tools/perf/util/parse-events.c | 18 ++++++++++++------ tools/perf/util/parse-events.h | 3 +++ 3 files changed, 16 insertions(+), 7 deletions(-)tools/perf/util/metricgroup.c +0
-0
tools/perf/util/metricgroup.c int metricgroup__parse_groups(const struct option *opt, · line 480
Quoted 5 lines
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);
nit, mixed tabs/spaces indent, other than that:
thanks,
jirka
Em Fri, Sep 15, 2017 at 08:45:10PM +0200, Jiri Olsa escreveu:
Quoted 10 lines · Andi Kleen
tools/perf/util/metricgroup.c int metricgroup__parse_groups(const struct option *opt, · line 480
Quoted 7 lines
+++
b/tools/perf/util/metricgroup.ctools/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);nit, mixed tabs/spaces indent, other than that:
Fixed that.
Quoted 1 line
Acked-by Jiri Olsa <[email protected]>
Thanks, applied.
- Arnaldo
tip-bot for Andi Kleen
merge bot[tip:perf/core] perf pmu: Improve error messages for missing PMUs
In reply to Andi Kleenperf pmu: Improve error messages for missing PMUs
Commit-ID: 333b566559019b146905c623bde7f455c1d5add3 Gitweb: http://git.kernel.org/tip/333b566559019b146905c623bde7f455c1d5add3 Author: Andi Kleen <[email protected]> AuthorDate: Wed, 13 Sep 2017 14:50:06 -0700 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 18 Sep 2017 09:40:20 -0300
perf pmu: Improve error messages for missing PMUs
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.
v2: Check asprintf
--- tools/perf/util/metricgroup.c | 2 +- tools/perf/util/parse-events.c | 18 ++++++++++++------ tools/perf/util/parse-events.h | 3 +++ 3 files changed, 16 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 +12 -6
@@ -1219,11 +1219,17 @@ static 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) { +if (asprintf (&err->str, +"Cannot find PMU `%s'. Missing kernel support?" , + name) <0 ) + err->str =NULL ;return -EINVAL ; + }if (pmu->default_config) { memcpy(&attr, pmu->default_config,
@@ -1733,8 +1739,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 ];
@@ -1789,8 +1795,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
@@ -1802,8 +1806,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 '%',