Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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 <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: bpf@vger.kernel.org
Link: https://lore.kernel.org/r/20230627181030.95608-11-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Ian Rogers and committed by
Arnaldo Carvalho de Melo
b30d4f0b b52cb995

+19 -6
+19 -6
tools/perf/util/parse-events.y
··· 291 291 { 292 292 struct parse_events_state *parse_state = _parse_state; 293 293 struct list_head *list = NULL, *orig_terms = NULL, *terms= NULL; 294 - struct parse_events_error *error = parse_state->error; 295 294 char *pattern = NULL; 296 295 297 296 #define CLEANUP \ ··· 301 302 free($1); \ 302 303 free(pattern); \ 303 304 } while(0) 304 - 305 - if (error) 306 - error->idx = @1.first_column; 307 305 308 306 if (parse_events_copy_term_list($2, &orig_terms)) { 309 307 CLEANUP; ··· 356 360 $2 = NULL; 357 361 } 358 362 if (!ok) { 363 + struct parse_events_error *error = parse_state->error; 364 + char *help; 365 + 366 + if (asprintf(&help, "Unabled to find PMU or event on a PMU of '%s'", $1) < 0) 367 + help = NULL; 368 + parse_events_error__handle(error, @1.first_column, 369 + strdup("Bad event or PMU"), 370 + help); 359 371 CLEANUP; 360 372 YYABORT; 361 373 } ··· 380 376 int err; 381 377 382 378 err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list); 383 - free($1); 384 - if (err < 0) 379 + if (err < 0) { 380 + struct parse_events_state *parse_state = _parse_state; 381 + struct parse_events_error *error = parse_state->error; 382 + char *help; 383 + 384 + if (asprintf(&help, "Unabled to find PMU or event on a PMU of '%s'", $1) < 0) 385 + help = NULL; 386 + parse_events_error__handle(error, @1.first_column, strdup("Bad event name"), help); 387 + free($1); 385 388 PE_ABORT(err); 389 + } 390 + free($1); 386 391 $$ = list; 387 392 } 388 393