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

Ian Rogers posted 1 patch 2 years, 2 months ago
tools/perf/util/parse-events.y | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
[PATCH v1] perf parse-events: Fix for term values that are raw events
Posted by Ian Rogers 2 years, 2 months ago
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@google.com>
---
 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
Re: [PATCH v1] perf parse-events: Fix for term values that are raw events
Posted by Ian Rogers 2 years, 2 months ago
On Wed, Sep 27, 2023 at 5:44 PM Ian Rogers <irogers@google.com> 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@google.com>

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
>
Re: [PATCH v1] perf parse-events: Fix for term values that are raw events
Posted by Namhyung Kim 2 years, 2 months ago
On Thu, Oct 5, 2023 at 3:13 PM Ian Rogers <irogers@google.com> wrote:
>
> On Wed, Sep 27, 2023 at 5:44 PM Ian Rogers <irogers@google.com> 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@google.com>

Applied to perf-tools-next, thanks!