[RFT PATCH 5/7] perf-iostat: Support wilder wildcard-match for pmus

Ian Rogers irogers at google.com
Mon Jan 26 08:44:01 PST 2026


On Mon, Jan 26, 2026 at 4:35 AM Yushan Wang <wangyushan12 at huawei.com> wrote:
>
> Current wildcard matching of pmu names only support the form of
> "<pmu_name>%d", which may not be sufficient for pmus with other forms of
> name (e.g. HiSilicon PCIe PMU has the name of "hisi_pcie%d_pmu%d").
>
> To address that, change the wildcard matching function into a callback,
> and add a new version of wildcard-matching function using the callback
> to support more flexible pmu names.

There's some discussion around PMU name matching here (and the replies):
https://lore.kernel.org/lkml/20251231224233.113839-12-zide.chen@intel.com/
that I think is relevant.

> Signed-off-by: Yushan Wang <wangyushan12 at huawei.com>
> ---
>  tools/perf/util/pmus.c | 12 +++++++++---
>  tools/perf/util/pmus.h |  3 +++
>  2 files changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/tools/perf/util/pmus.c b/tools/perf/util/pmus.c
> index 98be2eb8f1f0..35184d477d07 100644
> --- a/tools/perf/util/pmus.c
> +++ b/tools/perf/util/pmus.c
> @@ -402,7 +402,8 @@ struct perf_pmu *perf_pmus__scan_for_event(struct perf_pmu *pmu, const char *eve
>         return NULL;
>  }
>
> -struct perf_pmu *perf_pmus__scan_matching_wildcard(struct perf_pmu *pmu, const char *wildcard)
> +struct perf_pmu *perf_pmus__scan_matching(struct perf_pmu *pmu, const char *wildcard,
> +                                         perf_pmus_match_t match)
>  {
>         bool use_core_pmus = !pmu || pmu->is_core;
>
> @@ -436,19 +437,24 @@ struct perf_pmu *perf_pmus__scan_matching_wildcard(struct perf_pmu *pmu, const c
>         }
>         if (use_core_pmus) {
>                 list_for_each_entry_continue(pmu, &core_pmus, list) {
> -                       if (perf_pmu__wildcard_match(pmu, wildcard))
> +                       if (match(pmu, wildcard))
>                                 return pmu;
>                 }
>                 pmu = NULL;
>                 pmu = list_prepare_entry(pmu, &other_pmus, list);
>         }
>         list_for_each_entry_continue(pmu, &other_pmus, list) {
> -               if (perf_pmu__wildcard_match(pmu, wildcard))
> +               if (match(pmu, wildcard))
>                         return pmu;
>         }
>         return NULL;
>  }
>
> +struct perf_pmu *perf_pmus__scan_matching_wildcard(struct perf_pmu *pmu, const char *wildcard)
> +{
> +       return perf_pmus__scan_matching(pmu, wildcard, perf_pmu__wildcard_match);
> +}
> +
>  static struct perf_pmu *perf_pmus__scan_skip_duplicates(struct perf_pmu *pmu)
>  {
>         bool use_core_pmus = !pmu || pmu->is_core;
> diff --git a/tools/perf/util/pmus.h b/tools/perf/util/pmus.h
> index 7cb36863711a..9308afb5a7b8 100644
> --- a/tools/perf/util/pmus.h
> +++ b/tools/perf/util/pmus.h
> @@ -9,6 +9,8 @@ struct perf_event_attr;
>  struct perf_pmu;
>  struct print_callbacks;
>
> +typedef _Bool (*perf_pmus_match_t)(const struct perf_pmu *, const char *);

nit: can we use stdbool.h and make this return a bool?
nit: in general Linux style is to avoid typedefs:
https://www.kernel.org/doc/html/v4.10/process/coding-style.html#typedefs

Thanks,
Ian

> +
>  size_t pmu_name_len_no_suffix(const char *str);
>  /* Exposed for testing only. */
>  int pmu_name_cmp(const char *lhs_pmu_name, const char *rhs_pmu_name);
> @@ -22,6 +24,7 @@ struct perf_pmu *perf_pmus__find_by_attr(const struct perf_event_attr *attr);
>  struct perf_pmu *perf_pmus__scan(struct perf_pmu *pmu);
>  struct perf_pmu *perf_pmus__scan_core(struct perf_pmu *pmu);
>  struct perf_pmu *perf_pmus__scan_for_event(struct perf_pmu *pmu, const char *event);
> +struct perf_pmu *perf_pmus__scan_matching(struct perf_pmu *pmu, const char *wildcard, perf_pmus_match_t match);
>  struct perf_pmu *perf_pmus__scan_matching_wildcard(struct perf_pmu *pmu, const char *wildcard);
>
>  const struct perf_pmu *perf_pmus__pmu_for_pmu_filter(const char *str);
> --
> 2.33.0
>



More information about the linux-arm-kernel mailing list