Re: [PATCH v1] perf parse-events: Fix for term values that are raw events

From: Ian Rogers
Date: Thu Oct 05 2023 - 18:13:54 EST


On Wed, Sep 27, 2023 at 5:44 PM Ian Rogers <irogers@xxxxxxxxxx> wrote:
>
> Raw events can be strings like 'r0xead' but the 0x is optional so they
> can also be 'read'. On IcelakeX uncore_imc_free_running has an event
> called 'read' which may be programmed as:
> ```
> $ perf stat -e 'uncore_imc_free_running/event=read/' -a sleep 1
> ```
> However, the PE_RAW type isn't allowed on the right of a term, even
> though in this case we just want to interpret it as a string. This
> leads to the following error on IcelakeX:
> ```
> $ perf stat -e 'uncore_imc_free_running/event=read/' -a sleep 1
> event syntax error: '..nning/event=read/'
> \___ parser error
> 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
> ```
> Fix this by allowing raw types on the right of terms and treat them as
> strings, just as is already done for PE_LEGACY_CACHE. Make this
> consistent by just entirely removing name_or_legacy and always using
> name_or_raw that covers all three cases.
>
> Fixes: 6fd1e5191591 ("perf parse-events: Support PMUs for legacy cache events")
> Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>

Ping. As this is affecting IcelakeX, Kan?

Thanks,
Ian

> ---
> tools/perf/util/parse-events.y | 8 +++-----
> 1 file changed, 3 insertions(+), 5 deletions(-)
>
> diff --git a/tools/perf/util/parse-events.y b/tools/perf/util/parse-events.y
> index 4d9f3922a33d..de098caf0c1c 100644
> --- a/tools/perf/util/parse-events.y
> +++ b/tools/perf/util/parse-events.y
> @@ -78,7 +78,7 @@ static void free_list_evsel(struct list_head* list_evsel)
> %type <str> PE_MODIFIER_BP
> %type <str> PE_EVENT_NAME
> %type <str> PE_DRV_CFG_TERM
> -%type <str> name_or_raw name_or_legacy
> +%type <str> name_or_raw
> %destructor { free ($$); } <str>
> %type <term> event_term
> %destructor { parse_events_term__delete ($$); } <term>
> @@ -669,8 +669,6 @@ event_term
>
> name_or_raw: PE_RAW | PE_NAME | PE_LEGACY_CACHE
>
> -name_or_legacy: PE_NAME | PE_LEGACY_CACHE
> -
> event_term:
> PE_RAW
> {
> @@ -685,7 +683,7 @@ PE_RAW
> $$ = term;
> }
> |
> -name_or_raw '=' name_or_legacy
> +name_or_raw '=' name_or_raw
> {
> struct parse_events_term *term;
> int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, $1, $3, &@1, &@3);
> @@ -765,7 +763,7 @@ PE_TERM_HW
> $$ = term;
> }
> |
> -PE_TERM '=' name_or_legacy
> +PE_TERM '=' name_or_raw
> {
> struct parse_events_term *term;
> int err = parse_events_term__str(&term, $1, /*config=*/NULL, $3, &@1, &@3);
> --
> 2.42.0.515.g380fc7ccd1-goog
>