Re: [PATCH 2/5] perf pmu: Support more complex PMU event aliasing

From: Jiri Olsa
Date: Tue Jun 11 2019 - 12:15:06 EST


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.garry@xxxxxxxxxx>
> ---
> 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