]> www.infradead.org Git - users/hch/misc.git/commitdiff
perf evsel: Fix uniquification when PMU given without suffix
authorIan Rogers <irogers@google.com>
Thu, 18 Sep 2025 22:22:01 +0000 (15:22 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 19 Sep 2025 19:50:17 +0000 (16:50 -0300)
The PMU name is appearing twice in:
```
$ perf stat -e uncore_imc_free_running/data_total/ -A true

 Performance counter stats for 'system wide':

CPU0                 1.57 MiB  uncore_imc_free_running_0/uncore_imc_free_running,data_total/
CPU0                 1.58 MiB  uncore_imc_free_running_1/uncore_imc_free_running,data_total/
       0.000892376 seconds time elapsed
```

Use the pmu_name_len_no_suffix to avoid this problem.

Committer testing:

After this patch:

  root@x1:~# perf stat -e uncore_imc_free_running/data_total/ -A true

   Performance counter stats for 'system wide':

  CPU0                 1.69 MiB  uncore_imc_free_running_0/data_total/
  CPU0                 1.68 MiB  uncore_imc_free_running_1/data_total/

         0.002141605 seconds time elapsed

  root@x1:~#

Fixes: 7d45f402d3117e0b ("perf evlist: Make uniquifying counter names consistent")
Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.ibm.com>
Cc: Chun-Tse Shao <ctshao@google.com>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/evsel.c

index 6a31f9699b49f982186f3cb0364ef3e88d62bbec..6947072598b1c51067651d2e708b871df59f76c4 100644 (file)
@@ -4053,9 +4053,9 @@ bool evsel__set_needs_uniquify(struct evsel *counter, const struct perf_stat_con
 
 void evsel__uniquify_counter(struct evsel *counter)
 {
-       const char *name, *pmu_name;
-       char *new_name, *config;
-       int ret;
+       const char *name, *pmu_name, *config;
+       char *new_name;
+       int len, ret;
 
        /* No uniquification necessary. */
        if (!counter->needs_uniquify)
@@ -4069,15 +4069,23 @@ void evsel__uniquify_counter(struct evsel *counter)
        counter->uniquified_name = true;
 
        name = evsel__name(counter);
+       config = strchr(name, '/');
        pmu_name = counter->pmu->name;
-       /* Already prefixed by the PMU name. */
-       if (!strncmp(name, pmu_name, strlen(pmu_name)))
-               return;
 
-       config = strchr(name, '/');
-       if (config) {
-               int len = config - name;
+       /* Already prefixed by the PMU name? */
+       len = pmu_name_len_no_suffix(pmu_name);
+
+       if (!strncmp(name, pmu_name, len)) {
+               /*
+                * If the PMU name is there, then there is no sense in not
+                * having a slash. Do this for robustness.
+                */
+               if (config == NULL)
+                       config = name - 1;
 
+               ret = asprintf(&new_name, "%s/%s", pmu_name, config + 1);
+       } else if (config) {
+               len = config - name;
                if (config[1] == '/') {
                        /* case: event// */
                        ret = asprintf(&new_name, "%s/%.*s/%s", pmu_name, len, name, config + 2);
@@ -4089,7 +4097,7 @@ void evsel__uniquify_counter(struct evsel *counter)
                config = strchr(name, ':');
                if (config) {
                        /* case: event:.. */
-                       int len = config - name;
+                       len = config - name;
 
                        ret = asprintf(&new_name, "%s/%.*s/%s", pmu_name, len, name, config + 1);
                } else {