Messages in this thread | | | Subject | Re: [PATCH 2/5] perf pmu: Support more complex PMU event aliasing | From | John Garry <> | Date | Tue, 11 Jun 2019 17:22:33 +0100 |
| |
On 11/06/2019 17:10, Jiri Olsa wrote: > 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?
Yes, I think so.
Cheers,
> > jirka > > . >
| |