Messages in this thread | | | Date | Tue, 11 Jun 2019 18:10:23 +0200 | From | Jiri Olsa <> | Subject | Re: [PATCH 2/5] perf pmu: Support more complex PMU event aliasing |
| |
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@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
| |