On Mon, Jun 10, 2019 at 05:59:29PM +0800, John Garry wrote:
> The jevent "Unit" field is used for uncore PMU alias definition.
> 
> The form uncore_pmu_example_X is supported, where "X" is a wildcard,
> to support multiple instances of the same PMU in a system.
> 
> Unfortunately this format not suitable for all uncore PMUs; take the Hisi
> DDRC uncore PMU for example, where the name is in the form
> hisi_scclX_ddrcY.
> 
> For the current jevent parsing, we would be required to hardcode an uncore
> alias translation for each possible value of X. This is not scalable.
> 
> Instead, add support for "Unit" field in the form "hisi_sccl,ddrc", where
> we can match by hisi_scclX and ddrcY. Tokens in Unit field
> are delimited by ','.
> 
> Signed-off-by: John Garry <john.ga...@huawei.com>
> ---
>  tools/perf/util/pmu.c | 45 ++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 40 insertions(+), 5 deletions(-)
> 
> diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
> index 036047f56efa..f00cae750086 100644
> --- a/tools/perf/util/pmu.c
> +++ b/tools/perf/util/pmu.c
> @@ -700,6 +700,44 @@ struct pmu_events_map *perf_pmu__find_map(struct 
> perf_pmu *pmu)
>       return map;
>  }
>  
> +static bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
> +{
> +     /*
> +      * uncore alias may be from different PMU
> +      * with common prefix
> +      */
> +     if (!strncmp(pmu_name, name, strlen(pmu_name)))
> +             return true;
> +
> +     /* match strings with delimiter, ',' */
> +     while (1) {
> +             const char *delimiter;
> +             char token[256] = {};
> +             const char *found_token;
> +             int token_len;
> +
> +             delimiter = strchr(pmu_name, ',');
> +             if (delimiter) {
> +                     token_len = delimiter - pmu_name;
> +             } else {
> +                     token_len = strlen(pmu_name);
> +             }
> +
> +             memcpy(token, pmu_name, token_len);
> +
> +             found_token = strstr(name, token);
> +             if (!found_token)
> +                     return false;
> +
> +             /* No more delimiters, so we must be a match */
> +             if (!delimiter)
> +                     return true;
> +
> +             pmu_name += token_len + 1;
> +             name = found_token + token_len;
> +     }

hum, would this be easier with strtok_r?

jirka

Reply via email to