* [PATCH v2] perf: Skip and warn on unknown format 'configN' attrs @ 2022-09-09 20:45 Rob Herring 2022-09-12 10:35 ` Leo Yan 0 siblings, 1 reply; 4+ messages in thread From: Rob Herring @ 2022-09-09 20:45 UTC (permalink / raw) To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim Cc: James Clark, linux-perf-users, linux-kernel If the kernel exposes a new perf_event_attr field in a format attr, perf will return an error stating the specified PMU can't be found. For example, a format attr with 'config3:0-63' causes an error as config3 is unknown to perf. This causes a compatibility issue between a newer kernel with older perf tool. Before this change with a kernel adding 'config3' I get: $ perf record -e arm_spe// -- true event syntax error: 'arm_spe//' \___ Cannot find PMU `arm_spe'. Missing kernel support? Run 'perf list' for a list of valid events Usage: perf record [<options>] [<command>] or: perf record [<options>] -- <command> [<options>] -e, --event <event> event selector. use 'perf list' to list available events After this change, I get: $ perf record -e arm_spe// -- true WARNING: format 'inv_event_filter' requires 'config3' which is not supported by this version of perf! [ perf record: Woken up 2 times to write data ] [ perf record: Captured and wrote 0.091 MB perf.data ] To support unknown configN formats, rework the YACC implementation to pass any config[0-9]+ format to perf_pmu__new_format() to handle with a warning. Note that the user will get the warning if *any* PMU has an unsupported format attr even if that PMU isn't used. This is because perf tool scans all the PMUs. Signed-off-by: Rob Herring <robh@kernel.org> --- v2: - Rework YACC code to handle configN formats in C code - Add a warning when an unknown configN attr is found v1: https://lore.kernel.org/all/20220901184709.2179309-1-robh@kernel.org/ --- tools/perf/util/pmu.c | 6 ++++++ tools/perf/util/pmu.l | 2 -- tools/perf/util/pmu.y | 15 ++++----------- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 89655d53117a..6757db7d559c 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1475,6 +1475,12 @@ int perf_pmu__new_format(struct list_head *list, char *name, { struct perf_pmu_format *format; + if (config > PERF_PMU_FORMAT_VALUE_CONFIG2) { + pr_warning("WARNING: format '%s' requires 'config%d' which is not supported by this version of perf!\n", + name, config); + return 0; + } + format = zalloc(sizeof(*format)); if (!format) return -ENOMEM; diff --git a/tools/perf/util/pmu.l b/tools/perf/util/pmu.l index a15d9fbd7c0e..58b4926cfaca 100644 --- a/tools/perf/util/pmu.l +++ b/tools/perf/util/pmu.l @@ -27,8 +27,6 @@ num_dec [0-9]+ {num_dec} { return value(10); } config { return PP_CONFIG; } -config1 { return PP_CONFIG1; } -config2 { return PP_CONFIG2; } - { return '-'; } : { return ':'; } , { return ','; } diff --git a/tools/perf/util/pmu.y b/tools/perf/util/pmu.y index bfd7e8509869..283efe059819 100644 --- a/tools/perf/util/pmu.y +++ b/tools/perf/util/pmu.y @@ -20,7 +20,7 @@ do { \ %} -%token PP_CONFIG PP_CONFIG1 PP_CONFIG2 +%token PP_CONFIG %token PP_VALUE PP_ERROR %type <num> PP_VALUE %type <bits> bit_term @@ -47,18 +47,11 @@ PP_CONFIG ':' bits $3)); } | -PP_CONFIG1 ':' bits +PP_CONFIG PP_VALUE ':' bits { ABORT_ON(perf_pmu__new_format(format, name, - PERF_PMU_FORMAT_VALUE_CONFIG1, - $3)); -} -| -PP_CONFIG2 ':' bits -{ - ABORT_ON(perf_pmu__new_format(format, name, - PERF_PMU_FORMAT_VALUE_CONFIG2, - $3)); + $2, + $4)); } bits: -- 2.34.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2] perf: Skip and warn on unknown format 'configN' attrs 2022-09-09 20:45 [PATCH v2] perf: Skip and warn on unknown format 'configN' attrs Rob Herring @ 2022-09-12 10:35 ` Leo Yan 2022-09-12 13:55 ` Rob Herring 0 siblings, 1 reply; 4+ messages in thread From: Leo Yan @ 2022-09-12 10:35 UTC (permalink / raw) To: Rob Herring Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, James Clark, linux-perf-users, linux-kernel Hi Rob, On Fri, Sep 09, 2022 at 03:45:09PM -0500, Rob Herring wrote: > If the kernel exposes a new perf_event_attr field in a format attr, perf > will return an error stating the specified PMU can't be found. For > example, a format attr with 'config3:0-63' causes an error as config3 is > unknown to perf. This causes a compatibility issue between a newer > kernel with older perf tool. > > Before this change with a kernel adding 'config3' I get: > > $ perf record -e arm_spe// -- true > event syntax error: 'arm_spe//' > \___ Cannot find PMU `arm_spe'. Missing kernel support? > Run 'perf list' for a list of valid events > > Usage: perf record [<options>] [<command>] > or: perf record [<options>] -- <command> [<options>] > > -e, --event <event> event selector. use 'perf list' to list > available events > > After this change, I get: > > $ perf record -e arm_spe// -- true > WARNING: format 'inv_event_filter' requires 'config3' which is not supported by this version of perf! > [ perf record: Woken up 2 times to write data ] > [ perf record: Captured and wrote 0.091 MB perf.data ] > > To support unknown configN formats, rework the YACC implementation to > pass any config[0-9]+ format to perf_pmu__new_format() to handle with a > warning. > > Note that the user will get the warning if *any* PMU has an unsupported > format attr even if that PMU isn't used. This is because perf tool scans > all the PMUs. I think essentially you want to provide a bug fixing and the fixing can be back ported on long term supported kernels? If this is the case, it's good to add a fixes tag like below? Fixes: cd82a32e9924 ("perf tools: Add perf pmu object to access pmu format definition") > Signed-off-by: Rob Herring <robh@kernel.org> > --- > v2: > - Rework YACC code to handle configN formats in C code > - Add a warning when an unknown configN attr is found > > v1: https://lore.kernel.org/all/20220901184709.2179309-1-robh@kernel.org/ > --- > tools/perf/util/pmu.c | 6 ++++++ > tools/perf/util/pmu.l | 2 -- > tools/perf/util/pmu.y | 15 ++++----------- > 3 files changed, 10 insertions(+), 13 deletions(-) > > diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c > index 89655d53117a..6757db7d559c 100644 > --- a/tools/perf/util/pmu.c > +++ b/tools/perf/util/pmu.c > @@ -1475,6 +1475,12 @@ int perf_pmu__new_format(struct list_head *list, char *name, > { > struct perf_pmu_format *format; > > + if (config > PERF_PMU_FORMAT_VALUE_CONFIG2) { It's good to add a new macro PERF_PMU_FORMAT_VALUE_CONFIG_END in util/pmu.h. Then at here we can check the condition: if (config >= PERF_PMU_FORMAT_VALUE_CONFIG_END) { > + pr_warning("WARNING: format '%s' requires 'config%d' which is not supported by this version of perf!\n", > + name, config); ... so at here we can print log like: pr_warning("WARNING: format '%s' requires 'config%d' which is not " "supported by this version of perf (maximum config%d)!\n", name, config, PERF_PMU_FORMAT_VALUE_CONFIG_END - 1); The rest of this patch is fine for me. As a side topic, I know you want to support the SPEv1.2 feature with config3, seems to me a complete patch set series should include the changes for supporting config3 as well. This can give more clear view for how to fix incompatibility issue between old and new kernels, and how to support config3 in the latest kernel, but it's fine for me if you want to split into two patch sets. Thanks, Leo > + return 0; > + } > + > format = zalloc(sizeof(*format)); > if (!format) > return -ENOMEM; > diff --git a/tools/perf/util/pmu.l b/tools/perf/util/pmu.l > index a15d9fbd7c0e..58b4926cfaca 100644 > --- a/tools/perf/util/pmu.l > +++ b/tools/perf/util/pmu.l > @@ -27,8 +27,6 @@ num_dec [0-9]+ > > {num_dec} { return value(10); } > config { return PP_CONFIG; } > -config1 { return PP_CONFIG1; } > -config2 { return PP_CONFIG2; } > - { return '-'; } > : { return ':'; } > , { return ','; } > diff --git a/tools/perf/util/pmu.y b/tools/perf/util/pmu.y > index bfd7e8509869..283efe059819 100644 > --- a/tools/perf/util/pmu.y > +++ b/tools/perf/util/pmu.y > @@ -20,7 +20,7 @@ do { \ > > %} > > -%token PP_CONFIG PP_CONFIG1 PP_CONFIG2 > +%token PP_CONFIG > %token PP_VALUE PP_ERROR > %type <num> PP_VALUE > %type <bits> bit_term > @@ -47,18 +47,11 @@ PP_CONFIG ':' bits > $3)); > } > | > -PP_CONFIG1 ':' bits > +PP_CONFIG PP_VALUE ':' bits > { > ABORT_ON(perf_pmu__new_format(format, name, > - PERF_PMU_FORMAT_VALUE_CONFIG1, > - $3)); > -} > -| > -PP_CONFIG2 ':' bits > -{ > - ABORT_ON(perf_pmu__new_format(format, name, > - PERF_PMU_FORMAT_VALUE_CONFIG2, > - $3)); > + $2, > + $4)); > } > > bits: > -- > 2.34.1 > ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] perf: Skip and warn on unknown format 'configN' attrs 2022-09-12 10:35 ` Leo Yan @ 2022-09-12 13:55 ` Rob Herring 2022-09-13 2:17 ` Leo Yan 0 siblings, 1 reply; 4+ messages in thread From: Rob Herring @ 2022-09-12 13:55 UTC (permalink / raw) To: Leo Yan Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, James Clark, linux-perf-users, linux-kernel On Mon, Sep 12, 2022 at 5:35 AM Leo Yan <leo.yan@linaro.org> wrote: > > Hi Rob, > > On Fri, Sep 09, 2022 at 03:45:09PM -0500, Rob Herring wrote: > > If the kernel exposes a new perf_event_attr field in a format attr, perf > > will return an error stating the specified PMU can't be found. For > > example, a format attr with 'config3:0-63' causes an error as config3 is > > unknown to perf. This causes a compatibility issue between a newer > > kernel with older perf tool. > > > > Before this change with a kernel adding 'config3' I get: > > > > $ perf record -e arm_spe// -- true > > event syntax error: 'arm_spe//' > > \___ Cannot find PMU `arm_spe'. Missing kernel support? > > Run 'perf list' for a list of valid events > > > > Usage: perf record [<options>] [<command>] > > or: perf record [<options>] -- <command> [<options>] > > > > -e, --event <event> event selector. use 'perf list' to list > > available events > > > > After this change, I get: > > > > $ perf record -e arm_spe// -- true > > WARNING: format 'inv_event_filter' requires 'config3' which is not supported by this version of perf! > > [ perf record: Woken up 2 times to write data ] > > [ perf record: Captured and wrote 0.091 MB perf.data ] > > > > To support unknown configN formats, rework the YACC implementation to > > pass any config[0-9]+ format to perf_pmu__new_format() to handle with a > > warning. > > > > Note that the user will get the warning if *any* PMU has an unsupported > > format attr even if that PMU isn't used. This is because perf tool scans > > all the PMUs. > > I think essentially you want to provide a bug fixing and the fixing can > be back ported on long term supported kernels? Yes, certainly. I forgot to note that on this version. > If this is the case, > it's good to add a fixes tag like below? > > Fixes: cd82a32e9924 ("perf tools: Add perf pmu object to access pmu format definition") Probably not too important given this is from 2012. > > > Signed-off-by: Rob Herring <robh@kernel.org> > > --- > > v2: > > - Rework YACC code to handle configN formats in C code > > - Add a warning when an unknown configN attr is found > > > > v1: https://lore.kernel.org/all/20220901184709.2179309-1-robh@kernel.org/ > > --- > > tools/perf/util/pmu.c | 6 ++++++ > > tools/perf/util/pmu.l | 2 -- > > tools/perf/util/pmu.y | 15 ++++----------- > > 3 files changed, 10 insertions(+), 13 deletions(-) > > > > diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c > > index 89655d53117a..6757db7d559c 100644 > > --- a/tools/perf/util/pmu.c > > +++ b/tools/perf/util/pmu.c > > @@ -1475,6 +1475,12 @@ int perf_pmu__new_format(struct list_head *list, char *name, > > { > > struct perf_pmu_format *format; > > > > + if (config > PERF_PMU_FORMAT_VALUE_CONFIG2) { > > It's good to add a new macro PERF_PMU_FORMAT_VALUE_CONFIG_END in > util/pmu.h. Then at here we can check the condition: Sure. > > if (config >= PERF_PMU_FORMAT_VALUE_CONFIG_END) { > > > + pr_warning("WARNING: format '%s' requires 'config%d' which is not supported by this version of perf!\n", > > + name, config); > > ... so at here we can print log like: > > pr_warning("WARNING: format '%s' requires 'config%d' which is not " > "supported by this version of perf (maximum config%d)!\n", > name, config, PERF_PMU_FORMAT_VALUE_CONFIG_END - 1); I was trying to keep it to one line and given configN isn't expanded frequently it should be simple enough to figure out what version you need. > > The rest of this patch is fine for me. > > As a side topic, I know you want to support the SPEv1.2 feature with > config3, seems to me a complete patch set series should include the > changes for supporting config3 as well. This can give more clear view > for how to fix incompatibility issue between old and new kernels, and > how to support config3 in the latest kernel, but it's fine for me if > you want to split into two patch sets. I've sent out the SPE kernel support separately. I was told by Arnaldo to split perf tool and kernel side changes. Rob ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] perf: Skip and warn on unknown format 'configN' attrs 2022-09-12 13:55 ` Rob Herring @ 2022-09-13 2:17 ` Leo Yan 0 siblings, 0 replies; 4+ messages in thread From: Leo Yan @ 2022-09-13 2:17 UTC (permalink / raw) To: Rob Herring Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, James Clark, linux-perf-users, linux-kernel On Mon, Sep 12, 2022 at 08:55:32AM -0500, Rob Herring wrote: [...] > > If this is the case, > > it's good to add a fixes tag like below? > > > > Fixes: cd82a32e9924 ("perf tools: Add perf pmu object to access pmu format definition") > > Probably not too important given this is from 2012. Which means since 2012 there have no requirement for config3 :) AFAICT, perf tool should be forward compatible, so I think it's good for this patch to be landed on (old) LTS kernels. > > > Signed-off-by: Rob Herring <robh@kernel.org> > > > --- > > > v2: > > > - Rework YACC code to handle configN formats in C code > > > - Add a warning when an unknown configN attr is found > > > > > > v1: https://lore.kernel.org/all/20220901184709.2179309-1-robh@kernel.org/ > > > --- > > > tools/perf/util/pmu.c | 6 ++++++ > > > tools/perf/util/pmu.l | 2 -- > > > tools/perf/util/pmu.y | 15 ++++----------- > > > 3 files changed, 10 insertions(+), 13 deletions(-) > > > > > > diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c > > > index 89655d53117a..6757db7d559c 100644 > > > --- a/tools/perf/util/pmu.c > > > +++ b/tools/perf/util/pmu.c > > > @@ -1475,6 +1475,12 @@ int perf_pmu__new_format(struct list_head *list, char *name, > > > { > > > struct perf_pmu_format *format; > > > > > > + if (config > PERF_PMU_FORMAT_VALUE_CONFIG2) { > > > > It's good to add a new macro PERF_PMU_FORMAT_VALUE_CONFIG_END in > > util/pmu.h. Then at here we can check the condition: > > Sure. > > > > > if (config >= PERF_PMU_FORMAT_VALUE_CONFIG_END) { > > > > > + pr_warning("WARNING: format '%s' requires 'config%d' which is not supported by this version of perf!\n", > > > + name, config); > > > > ... so at here we can print log like: > > > > pr_warning("WARNING: format '%s' requires 'config%d' which is not " > > "supported by this version of perf (maximum config%d)!\n", > > name, config, PERF_PMU_FORMAT_VALUE_CONFIG_END - 1); > > I was trying to keep it to one line and given configN isn't expanded > frequently it should be simple enough to figure out what version you > need. It's fine for me. > > The rest of this patch is fine for me. > > > > As a side topic, I know you want to support the SPEv1.2 feature with > > config3, seems to me a complete patch set series should include the > > changes for supporting config3 as well. This can give more clear view > > for how to fix incompatibility issue between old and new kernels, and > > how to support config3 in the latest kernel, but it's fine for me if > > you want to split into two patch sets. > > I've sent out the SPE kernel support separately. I was told by Arnaldo > to split perf tool and kernel side changes. To be clear, it's right to split kernel and userspace parts into two patch set, but for userspace change I cannot find you sent patch to support config3 in perf tool, something in the [1] is missed, otherwise I don't think you provide complete support for config3 (and thus we have no chance to use new event format). Thanks, Leo [1] https://termbin.com/vdph ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-09-13 2:17 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-09-09 20:45 [PATCH v2] perf: Skip and warn on unknown format 'configN' attrs Rob Herring 2022-09-12 10:35 ` Leo Yan 2022-09-12 13:55 ` Rob Herring 2022-09-13 2:17 ` Leo Yan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).