mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 23:23:03 +00:00
perf metrics: Fix metric matching
The metric match function fails for cases like looking for "metric" in the string "all;foo_metric;metric" as the "metric" in "foo_metric" matches but isn't preceeded by a ';'. Fix this by matching the first list item and recursively matching on failure the next item after a semicolon. Signed-off-by: Ian Rogers <irogers@google.com> Reviewed-by: Kan Liang <kan.liang@linux.intel.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240224011420.3066322-1-irogers@google.com
This commit is contained in:
parent
ef5de1613d
commit
d4be39cade
@ -352,25 +352,23 @@ static int setup_metric_events(const char *pmu, struct hashmap *ids,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool match_metric(const char *n, const char *list)
|
||||
static bool match_metric(const char *metric_or_groups, const char *sought)
|
||||
{
|
||||
int len;
|
||||
char *m;
|
||||
|
||||
if (!list)
|
||||
if (!sought)
|
||||
return false;
|
||||
if (!strcmp(list, "all"))
|
||||
if (!strcmp(sought, "all"))
|
||||
return true;
|
||||
if (!n)
|
||||
return !strcasecmp(list, "No_group");
|
||||
len = strlen(list);
|
||||
m = strcasestr(n, list);
|
||||
if (!m)
|
||||
return false;
|
||||
if ((m == n || m[-1] == ';' || m[-1] == ' ') &&
|
||||
(m[len] == 0 || m[len] == ';'))
|
||||
if (!metric_or_groups)
|
||||
return !strcasecmp(sought, "No_group");
|
||||
len = strlen(sought);
|
||||
if (!strncasecmp(metric_or_groups, sought, len) &&
|
||||
(metric_or_groups[len] == 0 || metric_or_groups[len] == ';'))
|
||||
return true;
|
||||
return false;
|
||||
m = strchr(metric_or_groups, ';');
|
||||
return m && match_metric(m + 1, sought);
|
||||
}
|
||||
|
||||
static bool match_pm_metric(const struct pmu_metric *pm, const char *pmu, const char *metric)
|
||||
|
Loading…
Reference in New Issue
Block a user