aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Rogers <[email protected]>2023-06-27 11:10:27 -0700
committerArnaldo Carvalho de Melo <[email protected]>2023-07-28 19:01:16 -0300
commitb30d4f0b695428f513c561eeaea52e042ef48550 (patch)
tree4e68b2834346778a5efd82018591091a5a9dbf5c
parentb52cb995f1a559bc6e1a7cdc0ed0375503528541 (diff)
perf parse-events: Additional error reporting
When no events or PMUs match report an error for event_pmu: Before: ``` $ perf stat -e 'asdfasdf' -a sleep 1 Run 'perf list' for a list of valid events Usage: perf stat [<options>] [<command>] -e, --event <event> event selector. use 'perf list' to list available events ``` After: ``` $ perf stat -e 'asdfasdf' -a sleep 1 event syntax error: 'asdfasdf' \___ Bad event name Unabled to find PMU or event on a PMU of 'asdfasdf' Run 'perf list' for a list of valid events Usage: perf stat [<options>] [<command>] -e, --event <event> event selector. use 'perf list' to list available events ``` Fixes the inadvertent removal when hybrid parsing was modified. Fixes: 70c90e4a6b2fbe77 ("perf parse-events: Avoid scanning PMUs before parsing") Signed-off-by: Ian Rogers <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Athira Rajeev <[email protected]> Cc: Ian Rogers <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Kan Liang <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
-rw-r--r--tools/perf/util/parse-events.y25
1 files changed, 19 insertions, 6 deletions
diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
index f090a85c4518..a636a7db6e6f 100644
--- a/tools/perf/util/parse-events.y
+++ b/tools/perf/util/parse-events.y
@@ -291,7 +291,6 @@ PE_NAME opt_pmu_config
{
struct parse_events_state *parse_state = _parse_state;
struct list_head *list = NULL, *orig_terms = NULL, *terms= NULL;
- struct parse_events_error *error = parse_state->error;
char *pattern = NULL;
#define CLEANUP \
@@ -303,9 +302,6 @@ PE_NAME opt_pmu_config
free(pattern); \
} while(0)
- if (error)
- error->idx = @1.first_column;
-
if (parse_events_copy_term_list($2, &orig_terms)) {
CLEANUP;
YYNOMEM;
@@ -360,6 +356,14 @@ PE_NAME opt_pmu_config
$2 = NULL;
}
if (!ok) {
+ struct parse_events_error *error = parse_state->error;
+ char *help;
+
+ if (asprintf(&help, "Unabled to find PMU or event on a PMU of '%s'", $1) < 0)
+ help = NULL;
+ parse_events_error__handle(error, @1.first_column,
+ strdup("Bad event or PMU"),
+ help);
CLEANUP;
YYABORT;
}
@@ -376,9 +380,18 @@ PE_NAME sep_dc
int err;
err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list);
- free($1);
- if (err < 0)
+ if (err < 0) {
+ struct parse_events_state *parse_state = _parse_state;
+ struct parse_events_error *error = parse_state->error;
+ char *help;
+
+ if (asprintf(&help, "Unabled to find PMU or event on a PMU of '%s'", $1) < 0)
+ help = NULL;
+ parse_events_error__handle(error, @1.first_column, strdup("Bad event name"), help);
+ free($1);
PE_ABORT(err);
+ }
+ free($1);
$$ = list;
}