OSDN Git Service

perf pmu: Improve name/comments, avoid a memory allocation
authorIan Rogers <irogers@google.com>
Thu, 6 Apr 2023 23:52:55 +0000 (16:52 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 7 Apr 2023 00:54:01 +0000 (21:54 -0300)
Improve documentation around perf_pmu_alias pmu_name and on
functions.

Reduce the scope of pmu_uncore_alias_match to just file.

Rename perf_pmu__valid_suffix to the more revealing
perf_pmu__match_ignoring_suffix.

Add a short-cut to perf_pmu__match_ignoring_suffix for PMU names that
don't also have a socket value, and can therefore avoid a memory
allocation.

Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Rob Herring <robh@kernel.org>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20230406235256.2768773-1-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/pmu.c
tools/perf/util/pmu.h

index d033343..2e4f60b 100644 (file)
@@ -686,11 +686,14 @@ __weak const struct pmu_metrics_table *pmu_metrics_table__find(void)
        return perf_pmu__find_metrics_table(NULL);
 }
 
-/*
- * Suffix must be in form tok_{digits}, or tok{digits}, or same as pmu_name
- * to be valid.
+/**
+ * perf_pmu__match_ignoring_suffix - Does the pmu_name match tok ignoring any
+ *                                   trailing suffix? The Suffix must be in form
+ *                                   tok_{digits}, or tok{digits}.
+ * @pmu_name: The pmu_name with possible suffix.
+ * @tok: The possible match to pmu_name without suffix.
  */
-static bool perf_pmu__valid_suffix(const char *pmu_name, char *tok)
+static bool perf_pmu__match_ignoring_suffix(const char *pmu_name, const char *tok)
 {
        const char *p;
 
@@ -715,11 +718,21 @@ static bool perf_pmu__valid_suffix(const char *pmu_name, char *tok)
        return true;
 }
 
-bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
+/**
+ * pmu_uncore_alias_match - does name match the PMU name?
+ * @pmu_name: the json struct pmu_event name. This may lack a suffix (which
+ *            matches) or be of the form "socket,pmuname" which will match
+ *            "socketX_pmunameY".
+ * @name: a real full PMU name as from sysfs.
+ */
+static bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
 {
        char *tmp = NULL, *tok, *str;
        bool res;
 
+       if (strchr(pmu_name, ',') == NULL)
+               return perf_pmu__match_ignoring_suffix(name, pmu_name);
+
        str = strdup(pmu_name);
        if (!str)
                return false;
@@ -746,7 +759,7 @@ bool pmu_uncore_alias_match(const char *pmu_name, const char *name)
 
                name = strstr(name, tok);
                if (!name ||
-                   (!next_tok && !perf_pmu__valid_suffix(name, tok))) {
+                   (!next_tok && !perf_pmu__match_ignoring_suffix(name, tok))) {
                        res = false;
                        goto out;
                }
@@ -1961,7 +1974,7 @@ int perf_pmu__match(char *pattern, char *name, char *tok)
        if (fnmatch(pattern, name, 0))
                return -1;
 
-       if (tok && !perf_pmu__valid_suffix(name, tok))
+       if (tok && !perf_pmu__match_ignoring_suffix(name, tok))
                return -1;
 
        return 0;
index d53618c..b9a02de 100644 (file)
@@ -35,7 +35,7 @@ struct perf_pmu_caps {
 };
 
 /**
- * struct perf_pmu - hi
+ * struct perf_pmu
  */
 struct perf_pmu {
        /** @name: The name of the PMU such as "cpu". */
@@ -186,7 +186,10 @@ struct perf_pmu_alias {
         * default.
         */
        bool deprecated;
-       /** @pmu_name: The name copied from struct perf_pmu. */
+       /**
+        * @pmu_name: The name copied from the json struct pmu_event. This can
+        * differ from the PMU name as it won't have suffixes.
+        */
        char *pmu_name;
 };
 
@@ -238,7 +241,6 @@ void pmu_add_cpu_aliases_table(struct list_head *head, struct perf_pmu *pmu,
 char *perf_pmu__getcpuid(struct perf_pmu *pmu);
 const struct pmu_events_table *pmu_events_table__find(void);
 const struct pmu_metrics_table *pmu_metrics_table__find(void);
-bool pmu_uncore_alias_match(const char *pmu_name, const char *name);
 void perf_pmu_free_alias(struct perf_pmu_alias *alias);
 
 int perf_pmu__convert_scale(const char *scale, char **end, double *sval);