* [PATCH v2 0/3] Test/uniquification related fixes
@ 2025-09-18 22:21 Ian Rogers
2025-09-18 22:22 ` [PATCH v2 1/3] perf test: Don't leak workload gopipe in PERF_RECORD_* Ian Rogers
` (3 more replies)
0 siblings, 4 replies; 8+ messages in thread
From: Ian Rogers @ 2025-09-18 22:21 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, Kan Liang, Athira Rajeev,
Chun-Tse Shao, James Clark, Howard Chu, linux-kernel,
linux-perf-users
Failures discovered running as non-root and with v6.17-rc1 changes.
v2: Fix uniquification test when running as non-root. Rebase on
tmp.perf-tools-next where the first patch was already merged.
Ian Rogers (3):
perf test: Don't leak workload gopipe in PERF_RECORD_*
perf evsel: Fix uniquification when PMU given without suffix
perf test: Avoid uncore_imc/clockticks in uniquification test
tools/perf/tests/perf-record.c | 4 +
.../tests/shell/stat+event_uniquifying.sh | 109 ++++++++----------
tools/perf/util/evsel.c | 28 +++--
3 files changed, 71 insertions(+), 70 deletions(-)
--
2.51.0.470.ga7dc726c21-goog
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/3] perf test: Don't leak workload gopipe in PERF_RECORD_*
2025-09-18 22:21 [PATCH v2 0/3] Test/uniquification related fixes Ian Rogers
@ 2025-09-18 22:22 ` Ian Rogers
2025-09-18 22:22 ` [PATCH v2 2/3] perf evsel: Fix uniquification when PMU given without suffix Ian Rogers
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: Ian Rogers @ 2025-09-18 22:22 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, Kan Liang, Athira Rajeev,
Chun-Tse Shao, James Clark, Howard Chu, linux-kernel,
linux-perf-users
The test starts a workload and then opens events. If the events fail
to open, for example because of perf_event_paranoid, the gopipe of the
workload is leaked and the file descriptor leak check fails when the
test exits. To avoid this cancel the workload when opening the events
fails.
Before:
```
$ perf test -vv 7
7: PERF_RECORD_* events & perf_sample fields:
--- start ---
test child forked, pid 1189568
Using CPUID GenuineIntel-6-B7-1
------------------------------------------------------------
perf_event_attr:
type 0 (PERF_TYPE_HARDWARE)
config 0xa00000000 (cpu_atom/PERF_COUNT_HW_CPU_CYCLES/)
disabled 1
------------------------------------------------------------
sys_perf_event_open: pid 0 cpu -1 group_fd -1 flags 0x8
sys_perf_event_open failed, error -13
------------------------------------------------------------
perf_event_attr:
type 0 (PERF_TYPE_HARDWARE)
config 0xa00000000 (cpu_atom/PERF_COUNT_HW_CPU_CYCLES/)
disabled 1
exclude_kernel 1
------------------------------------------------------------
sys_perf_event_open: pid 0 cpu -1 group_fd -1 flags 0x8 = 3
------------------------------------------------------------
perf_event_attr:
type 0 (PERF_TYPE_HARDWARE)
config 0x400000000 (cpu_core/PERF_COUNT_HW_CPU_CYCLES/)
disabled 1
------------------------------------------------------------
sys_perf_event_open: pid 0 cpu -1 group_fd -1 flags 0x8
sys_perf_event_open failed, error -13
------------------------------------------------------------
perf_event_attr:
type 0 (PERF_TYPE_HARDWARE)
config 0x400000000 (cpu_core/PERF_COUNT_HW_CPU_CYCLES/)
disabled 1
exclude_kernel 1
------------------------------------------------------------
sys_perf_event_open: pid 0 cpu -1 group_fd -1 flags 0x8 = 3
Attempt to add: software/cpu-clock/
..after resolving event: software/config=0/
cpu-clock -> software/cpu-clock/
------------------------------------------------------------
perf_event_attr:
type 1 (PERF_TYPE_SOFTWARE)
size 136
config 0x9 (PERF_COUNT_SW_DUMMY)
sample_type IP|TID|TIME|CPU
read_format ID|LOST
disabled 1
inherit 1
mmap 1
comm 1
enable_on_exec 1
task 1
sample_id_all 1
mmap2 1
comm_exec 1
ksymbol 1
bpf_event 1
{ wakeup_events, wakeup_watermark } 1
------------------------------------------------------------
sys_perf_event_open: pid 1189569 cpu 0 group_fd -1 flags 0x8
sys_perf_event_open failed, error -13
perf_evlist__open: Permission denied
---- end(-2) ----
Leak of file descriptor 6 that opened: 'pipe:[14200347]'
---- unexpected signal (6) ----
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
Failed to read build ID for //anon
#0 0x565358f6666e in child_test_sig_handler builtin-test.c:311
#1 0x7f29ce849df0 in __restore_rt libc_sigaction.c:0
#2 0x7f29ce89e95c in __pthread_kill_implementation pthread_kill.c:44
#3 0x7f29ce849cc2 in raise raise.c:27
#4 0x7f29ce8324ac in abort abort.c:81
#5 0x565358f662d4 in check_leaks builtin-test.c:226
#6 0x565358f6682e in run_test_child builtin-test.c:344
#7 0x565358ef7121 in start_command run-command.c:128
#8 0x565358f67273 in start_test builtin-test.c:545
#9 0x565358f6771d in __cmd_test builtin-test.c:647
#10 0x565358f682bd in cmd_test builtin-test.c:849
#11 0x565358ee5ded in run_builtin perf.c:349
#12 0x565358ee6085 in handle_internal_command perf.c:401
#13 0x565358ee61de in run_argv perf.c:448
#14 0x565358ee6527 in main perf.c:555
#15 0x7f29ce833ca8 in __libc_start_call_main libc_start_call_main.h:74
#16 0x7f29ce833d65 in __libc_start_main@@GLIBC_2.34 libc-start.c:128
#17 0x565358e391c1 in _start perf[851c1]
7: PERF_RECORD_* events & perf_sample fields : FAILED!
```
After:
```
$ perf test 7
7: PERF_RECORD_* events & perf_sample fields : Skip (permissions)
```
Fixes: 16d00fee7038 ("perf tests: Move test__PERF_RECORD into separate object")
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/tests/perf-record.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/tools/perf/tests/perf-record.c b/tools/perf/tests/perf-record.c
index d895df037707..efbd9cd60c63 100644
--- a/tools/perf/tests/perf-record.c
+++ b/tools/perf/tests/perf-record.c
@@ -130,6 +130,7 @@ static int test__PERF_RECORD(struct test_suite *test __maybe_unused, int subtest
if (err < 0) {
pr_debug("sched__get_first_possible_cpu: %s\n",
str_error_r(errno, sbuf, sizeof(sbuf)));
+ evlist__cancel_workload(evlist);
goto out_delete_evlist;
}
@@ -141,6 +142,7 @@ static int test__PERF_RECORD(struct test_suite *test __maybe_unused, int subtest
if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, cpu_mask) < 0) {
pr_debug("sched_setaffinity: %s\n",
str_error_r(errno, sbuf, sizeof(sbuf)));
+ evlist__cancel_workload(evlist);
goto out_delete_evlist;
}
@@ -152,6 +154,7 @@ static int test__PERF_RECORD(struct test_suite *test __maybe_unused, int subtest
if (err < 0) {
pr_debug("perf_evlist__open: %s\n",
str_error_r(errno, sbuf, sizeof(sbuf)));
+ evlist__cancel_workload(evlist);
goto out_delete_evlist;
}
@@ -164,6 +167,7 @@ static int test__PERF_RECORD(struct test_suite *test __maybe_unused, int subtest
if (err < 0) {
pr_debug("evlist__mmap: %s\n",
str_error_r(errno, sbuf, sizeof(sbuf)));
+ evlist__cancel_workload(evlist);
goto out_delete_evlist;
}
--
2.51.0.470.ga7dc726c21-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 2/3] perf evsel: Fix uniquification when PMU given without suffix
2025-09-18 22:21 [PATCH v2 0/3] Test/uniquification related fixes Ian Rogers
2025-09-18 22:22 ` [PATCH v2 1/3] perf test: Don't leak workload gopipe in PERF_RECORD_* Ian Rogers
@ 2025-09-18 22:22 ` Ian Rogers
2025-09-18 22:22 ` [PATCH v2 3/3] perf test: Avoid uncore_imc/clockticks in uniquification test Ian Rogers
2025-09-19 19:51 ` [PATCH v2 0/3] Test/uniquification related fixes Arnaldo Carvalho de Melo
3 siblings, 0 replies; 8+ messages in thread
From: Ian Rogers @ 2025-09-18 22:22 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, Kan Liang, Athira Rajeev,
Chun-Tse Shao, James Clark, Howard Chu, linux-kernel,
linux-perf-users
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.
Fixes: 7d45f402d311 ("perf evlist: Make uniquifying counter names consistent")
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/util/evsel.c | 28 ++++++++++++++++++----------
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 6a31f9699b49..6947072598b1 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -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 {
--
2.51.0.470.ga7dc726c21-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 3/3] perf test: Avoid uncore_imc/clockticks in uniquification test
2025-09-18 22:21 [PATCH v2 0/3] Test/uniquification related fixes Ian Rogers
2025-09-18 22:22 ` [PATCH v2 1/3] perf test: Don't leak workload gopipe in PERF_RECORD_* Ian Rogers
2025-09-18 22:22 ` [PATCH v2 2/3] perf evsel: Fix uniquification when PMU given without suffix Ian Rogers
@ 2025-09-18 22:22 ` Ian Rogers
2025-09-26 9:00 ` Qiao Zhao
2025-09-19 19:51 ` [PATCH v2 0/3] Test/uniquification related fixes Arnaldo Carvalho de Melo
3 siblings, 1 reply; 8+ messages in thread
From: Ian Rogers @ 2025-09-18 22:22 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, Kan Liang, Athira Rajeev,
Chun-Tse Shao, James Clark, Howard Chu, linux-kernel,
linux-perf-users
The detection of uncore_imc may happen for free running PMUs and the
clockticks event may be present on uncore_clock. Rewrite the test to
detect duplicated/deduplicated events from perf list, not hardcoded to
uncore_imc.
If perf stat fails then assume it is permissions and skip the test.
Fixes: 070b315333ee ("perf test: Restrict uniquifying test to machines with 'uncore_imc'")
Signed-off-by: Ian Rogers <irogers@google.com>
---
.../tests/shell/stat+event_uniquifying.sh | 109 ++++++++----------
1 file changed, 49 insertions(+), 60 deletions(-)
diff --git a/tools/perf/tests/shell/stat+event_uniquifying.sh b/tools/perf/tests/shell/stat+event_uniquifying.sh
index bf54bd6c3e2e..b5dec6b6da36 100755
--- a/tools/perf/tests/shell/stat+event_uniquifying.sh
+++ b/tools/perf/tests/shell/stat+event_uniquifying.sh
@@ -4,74 +4,63 @@
set -e
-stat_output=$(mktemp /tmp/__perf_test.stat_output.XXXXX)
-perf_tool=perf
err=0
+stat_output=$(mktemp /tmp/__perf_test.stat_output.XXXXX)
-test_event_uniquifying() {
- # We use `clockticks` in `uncore_imc` to verify the uniquify behavior.
- pmu="uncore_imc"
- event="clockticks"
-
- # If the `-A` option is added, the event should be uniquified.
- #
- # $perf list -v clockticks
- #
- # List of pre-defined events (to be used in -e or -M):
- #
- # uncore_imc_0/clockticks/ [Kernel PMU event]
- # uncore_imc_1/clockticks/ [Kernel PMU event]
- # uncore_imc_2/clockticks/ [Kernel PMU event]
- # uncore_imc_3/clockticks/ [Kernel PMU event]
- # uncore_imc_4/clockticks/ [Kernel PMU event]
- # uncore_imc_5/clockticks/ [Kernel PMU event]
- #
- # ...
- #
- # $perf stat -e clockticks -A -- true
- #
- # Performance counter stats for 'system wide':
- #
- # CPU0 3,773,018 uncore_imc_0/clockticks/
- # CPU0 3,609,025 uncore_imc_1/clockticks/
- # CPU0 0 uncore_imc_2/clockticks/
- # CPU0 3,230,009 uncore_imc_3/clockticks/
- # CPU0 3,049,897 uncore_imc_4/clockticks/
- # CPU0 0 uncore_imc_5/clockticks/
- #
- # 0.002029828 seconds time elapsed
-
- echo "stat event uniquifying test"
- uniquified_event_array=()
+cleanup() {
+ rm -f "${stat_output}"
- # Skip if the machine does not have `uncore_imc` device.
- if ! ${perf_tool} list pmu | grep -q ${pmu}; then
- echo "Target does not support PMU ${pmu} [Skipped]"
- err=2
- return
- fi
+ trap - EXIT TERM INT
+}
- # Check how many uniquified events.
- while IFS= read -r line; do
- uniquified_event=$(echo "$line" | awk '{print $1}')
- uniquified_event_array+=("${uniquified_event}")
- done < <(${perf_tool} list -v ${event} | grep ${pmu})
+trap_cleanup() {
+ echo "Unexpected signal in ${FUNCNAME[1]}"
+ cleanup
+ exit 1
+}
+trap trap_cleanup EXIT TERM INT
- perf_command="${perf_tool} stat -e $event -A -o ${stat_output} -- true"
- $perf_command
+test_event_uniquifying() {
+ echo "Uniquification of PMU sysfs events test"
- # Check the output contains all uniquified events.
- for uniquified_event in "${uniquified_event_array[@]}"; do
- if ! cat "${stat_output}" | grep -q "${uniquified_event}"; then
- echo "Event is not uniquified [Failed]"
- echo "${perf_command}"
- cat "${stat_output}"
- err=1
- break
- fi
+ # Read events from perf list with and without -v. With -v the duplicate PMUs
+ # aren't deduplicated. Note, json events are listed by perf list without a
+ # PMU.
+ read -ra pmu_events <<< "$(perf list --raw pmu)"
+ read -ra pmu_v_events <<< "$(perf list -v --raw pmu)"
+ # For all non-deduplicated events.
+ for pmu_v_event in "${pmu_v_events[@]}"; do
+ # If the event matches an event in the deduplicated events then it musn't
+ # be an event with duplicate PMUs, continue the outer loop.
+ for pmu_event in "${pmu_events[@]}"; do
+ if [[ "$pmu_v_event" == "$pmu_event" ]]; then
+ continue 2
+ fi
+ done
+ # Strip the suffix from the non-deduplicated event's PMU.
+ event=$(echo "$pmu_v_event" | sed -E 's/_[0-9]+//')
+ for pmu_event in "${pmu_events[@]}"; do
+ if [[ "$event" == "$pmu_event" ]]; then
+ echo "Testing event ${event} is uniquified to ${pmu_v_event}"
+ if ! perf stat -e "$event" -A -o ${stat_output} -- true; then
+ echo "Error running perf stat for event '$event' [Skip]"
+ if [ $err = 0 ]; then
+ err=2
+ fi
+ continue
+ fi
+ # Ensure the non-deduplicated event appears in the output.
+ if ! grep -q "${pmu_v_event}" "${stat_output}"; then
+ echo "Uniquification of PMU sysfs events test [Failed]"
+ cat "${stat_output}"
+ err=1
+ fi
+ break
+ fi
+ done
done
}
test_event_uniquifying
-rm -f "${stat_output}"
+cleanup
exit $err
--
2.51.0.470.ga7dc726c21-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 0/3] Test/uniquification related fixes
2025-09-18 22:21 [PATCH v2 0/3] Test/uniquification related fixes Ian Rogers
` (2 preceding siblings ...)
2025-09-18 22:22 ` [PATCH v2 3/3] perf test: Avoid uncore_imc/clockticks in uniquification test Ian Rogers
@ 2025-09-19 19:51 ` Arnaldo Carvalho de Melo
3 siblings, 0 replies; 8+ messages in thread
From: Arnaldo Carvalho de Melo @ 2025-09-19 19:51 UTC (permalink / raw)
To: Ian Rogers
Cc: Peter Zijlstra, Ingo Molnar, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Adrian Hunter, Kan Liang,
Athira Rajeev, Chun-Tse Shao, James Clark, Howard Chu,
linux-kernel, linux-perf-users
On Thu, Sep 18, 2025 at 03:21:59PM -0700, Ian Rogers wrote:
> Failures discovered running as non-root and with v6.17-rc1 changes.
>
> v2: Fix uniquification test when running as non-root. Rebase on
> tmp.perf-tools-next where the first patch was already merged.
Thanks, all reproduced before/after and applied.
- Arnaldo
> Ian Rogers (3):
> perf test: Don't leak workload gopipe in PERF_RECORD_*
> perf evsel: Fix uniquification when PMU given without suffix
> perf test: Avoid uncore_imc/clockticks in uniquification test
>
> tools/perf/tests/perf-record.c | 4 +
> .../tests/shell/stat+event_uniquifying.sh | 109 ++++++++----------
> tools/perf/util/evsel.c | 28 +++--
> 3 files changed, 71 insertions(+), 70 deletions(-)
>
> --
> 2.51.0.470.ga7dc726c21-goog
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 3/3] perf test: Avoid uncore_imc/clockticks in uniquification test
2025-09-18 22:22 ` [PATCH v2 3/3] perf test: Avoid uncore_imc/clockticks in uniquification test Ian Rogers
@ 2025-09-26 9:00 ` Qiao Zhao
2025-09-26 16:21 ` Ian Rogers
0 siblings, 1 reply; 8+ messages in thread
From: Qiao Zhao @ 2025-09-26 9:00 UTC (permalink / raw)
To: Ian Rogers
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Adrian Hunter, Kan Liang, Athira Rajeev, Chun-Tse Shao,
James Clark, Howard Chu, linux-kernel, linux-perf-users
Hi Ian,
I tested your patch (latest linux-next code + your patch) on hybrid
CPU machine {CPU Model name: 12th Gen Intel(R) Core(TM) i7-12800HE}
and failed,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# perf test -vv "perf stat events uniquifying"
95: perf stat events uniquifying:
--- start ---
test child forked, pid 21799
Uniquification of PMU sysfs events test
Testing event uncore_imc_free_running/data_read/ is uniquified to
uncore_imc_free_running_0/data_read/
Uniquification of PMU sysfs events test [Failed]
# started on Fri Sep 26 04:49:54 2025
Performance counter stats for 'system wide':
CPU0 1.47 MiB
uncore_imc_free_running_0/uncore_imc_free_running,data_read/
CPU0 1.47 MiB
uncore_imc_free_running_1/uncore_imc_free_running,data_read/
0.000925108 seconds time elapsed
Testing event uncore_imc_free_running/data_total/ is uniquified to
uncore_imc_free_running_0/data_total/
Uniquification of PMU sysfs events test [Failed]
# started on Fri Sep 26 04:49:54 2025
Performance counter stats for 'system wide':
CPU0 0.59 MiB
uncore_imc_free_running_0/uncore_imc_free_running,data_total/
CPU0 0.58 MiB
uncore_imc_free_running_1/uncore_imc_free_running,data_total/
0.000969877 seconds time elapsed
Testing event uncore_imc_free_running/data_write/ is uniquified to
uncore_imc_free_running_0/data_write/
Uniquification of PMU sysfs events test [Failed]
# started on Fri Sep 26 04:49:54 2025
Performance counter stats for 'system wide':
CPU0 0.00 MiB
uncore_imc_free_running_0/uncore_imc_free_running,data_write/
CPU0 0.00 MiB
uncore_imc_free_running_1/uncore_imc_free_running,data_write/
0.001183888 seconds time elapsed
Testing event uncore_imc_free_running/data_read/ is uniquified to
uncore_imc_free_running_1/data_read/
Uniquification of PMU sysfs events test [Failed]
# started on Fri Sep 26 04:49:54 2025
Performance counter stats for 'system wide':
CPU0 0.29 MiB
uncore_imc_free_running_0/uncore_imc_free_running,data_read/
CPU0 0.29 MiB
uncore_imc_free_running_1/uncore_imc_free_running,data_read/
0.000710088 seconds time elapsed
Testing event uncore_imc_free_running/data_total/ is uniquified to
uncore_imc_free_running_1/data_total/
Uniquification of PMU sysfs events test [Failed]
# started on Fri Sep 26 04:49:54 2025
Performance counter stats for 'system wide':
CPU0 0.62 MiB
uncore_imc_free_running_0/uncore_imc_free_running,data_total/
CPU0 0.67 MiB
uncore_imc_free_running_1/uncore_imc_free_running,data_total/
0.000959074 seconds time elapsed
Testing event uncore_imc_free_running/data_write/ is uniquified to
uncore_imc_free_running_1/data_write/
Uniquification of PMU sysfs events test [Failed]
# started on Fri Sep 26 04:49:54 2025
Performance counter stats for 'system wide':
CPU0 0.23 MiB
uncore_imc_free_running_0/uncore_imc_free_running,data_write/
CPU0 0.23 MiB
uncore_imc_free_running_1/uncore_imc_free_running,data_write/
0.000775028 seconds time elapsed
---- end(-1) ----
95: perf stat events uniquifying : FAILED!
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# ls -la /sys/bus/event_source/devices/uncore_imc_free_running_*/events/
/sys/bus/event_source/devices/uncore_imc_free_running_0/events/:
total 0
drwxr-xr-x. 2 root root 0 Sep 26 04:57 .
drwxr-xr-x. 5 root root 0 Sep 26 01:49 ..
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_read
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.scale
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.unit
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_total
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.scale
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.unit
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_write
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.scale
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.unit
/sys/bus/event_source/devices/uncore_imc_free_running_1/events/:
total 0
drwxr-xr-x. 2 root root 0 Sep 26 04:57 .
drwxr-xr-x. 5 root root 0 Sep 26 01:49 ..
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_read
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.scale
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.unit
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_total
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.scale
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.unit
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_write
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.scale
-r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.unit
- Qiao
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
On Fri, Sep 19, 2025 at 6:22 AM Ian Rogers <irogers@google.com> wrote:
>
> The detection of uncore_imc may happen for free running PMUs and the
> clockticks event may be present on uncore_clock. Rewrite the test to
> detect duplicated/deduplicated events from perf list, not hardcoded to
> uncore_imc.
>
> If perf stat fails then assume it is permissions and skip the test.
>
> Fixes: 070b315333ee ("perf test: Restrict uniquifying test to machines with 'uncore_imc'")
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
> .../tests/shell/stat+event_uniquifying.sh | 109 ++++++++----------
> 1 file changed, 49 insertions(+), 60 deletions(-)
>
> diff --git a/tools/perf/tests/shell/stat+event_uniquifying.sh b/tools/perf/tests/shell/stat+event_uniquifying.sh
> index bf54bd6c3e2e..b5dec6b6da36 100755
> --- a/tools/perf/tests/shell/stat+event_uniquifying.sh
> +++ b/tools/perf/tests/shell/stat+event_uniquifying.sh
> @@ -4,74 +4,63 @@
>
> set -e
>
> -stat_output=$(mktemp /tmp/__perf_test.stat_output.XXXXX)
> -perf_tool=perf
> err=0
> +stat_output=$(mktemp /tmp/__perf_test.stat_output.XXXXX)
>
> -test_event_uniquifying() {
> - # We use `clockticks` in `uncore_imc` to verify the uniquify behavior.
> - pmu="uncore_imc"
> - event="clockticks"
> -
> - # If the `-A` option is added, the event should be uniquified.
> - #
> - # $perf list -v clockticks
> - #
> - # List of pre-defined events (to be used in -e or -M):
> - #
> - # uncore_imc_0/clockticks/ [Kernel PMU event]
> - # uncore_imc_1/clockticks/ [Kernel PMU event]
> - # uncore_imc_2/clockticks/ [Kernel PMU event]
> - # uncore_imc_3/clockticks/ [Kernel PMU event]
> - # uncore_imc_4/clockticks/ [Kernel PMU event]
> - # uncore_imc_5/clockticks/ [Kernel PMU event]
> - #
> - # ...
> - #
> - # $perf stat -e clockticks -A -- true
> - #
> - # Performance counter stats for 'system wide':
> - #
> - # CPU0 3,773,018 uncore_imc_0/clockticks/
> - # CPU0 3,609,025 uncore_imc_1/clockticks/
> - # CPU0 0 uncore_imc_2/clockticks/
> - # CPU0 3,230,009 uncore_imc_3/clockticks/
> - # CPU0 3,049,897 uncore_imc_4/clockticks/
> - # CPU0 0 uncore_imc_5/clockticks/
> - #
> - # 0.002029828 seconds time elapsed
> -
> - echo "stat event uniquifying test"
> - uniquified_event_array=()
> +cleanup() {
> + rm -f "${stat_output}"
>
> - # Skip if the machine does not have `uncore_imc` device.
> - if ! ${perf_tool} list pmu | grep -q ${pmu}; then
> - echo "Target does not support PMU ${pmu} [Skipped]"
> - err=2
> - return
> - fi
> + trap - EXIT TERM INT
> +}
>
> - # Check how many uniquified events.
> - while IFS= read -r line; do
> - uniquified_event=$(echo "$line" | awk '{print $1}')
> - uniquified_event_array+=("${uniquified_event}")
> - done < <(${perf_tool} list -v ${event} | grep ${pmu})
> +trap_cleanup() {
> + echo "Unexpected signal in ${FUNCNAME[1]}"
> + cleanup
> + exit 1
> +}
> +trap trap_cleanup EXIT TERM INT
>
> - perf_command="${perf_tool} stat -e $event -A -o ${stat_output} -- true"
> - $perf_command
> +test_event_uniquifying() {
> + echo "Uniquification of PMU sysfs events test"
>
> - # Check the output contains all uniquified events.
> - for uniquified_event in "${uniquified_event_array[@]}"; do
> - if ! cat "${stat_output}" | grep -q "${uniquified_event}"; then
> - echo "Event is not uniquified [Failed]"
> - echo "${perf_command}"
> - cat "${stat_output}"
> - err=1
> - break
> - fi
> + # Read events from perf list with and without -v. With -v the duplicate PMUs
> + # aren't deduplicated. Note, json events are listed by perf list without a
> + # PMU.
> + read -ra pmu_events <<< "$(perf list --raw pmu)"
> + read -ra pmu_v_events <<< "$(perf list -v --raw pmu)"
> + # For all non-deduplicated events.
> + for pmu_v_event in "${pmu_v_events[@]}"; do
> + # If the event matches an event in the deduplicated events then it musn't
> + # be an event with duplicate PMUs, continue the outer loop.
> + for pmu_event in "${pmu_events[@]}"; do
> + if [[ "$pmu_v_event" == "$pmu_event" ]]; then
> + continue 2
> + fi
> + done
> + # Strip the suffix from the non-deduplicated event's PMU.
> + event=$(echo "$pmu_v_event" | sed -E 's/_[0-9]+//')
> + for pmu_event in "${pmu_events[@]}"; do
> + if [[ "$event" == "$pmu_event" ]]; then
> + echo "Testing event ${event} is uniquified to ${pmu_v_event}"
> + if ! perf stat -e "$event" -A -o ${stat_output} -- true; then
> + echo "Error running perf stat for event '$event' [Skip]"
> + if [ $err = 0 ]; then
> + err=2
> + fi
> + continue
> + fi
> + # Ensure the non-deduplicated event appears in the output.
> + if ! grep -q "${pmu_v_event}" "${stat_output}"; then
> + echo "Uniquification of PMU sysfs events test [Failed]"
> + cat "${stat_output}"
> + err=1
> + fi
> + break
> + fi
> + done
> done
> }
>
> test_event_uniquifying
> -rm -f "${stat_output}"
> +cleanup
> exit $err
> --
> 2.51.0.470.ga7dc726c21-goog
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 3/3] perf test: Avoid uncore_imc/clockticks in uniquification test
2025-09-26 9:00 ` Qiao Zhao
@ 2025-09-26 16:21 ` Ian Rogers
2025-09-29 2:39 ` Qiao Zhao
0 siblings, 1 reply; 8+ messages in thread
From: Ian Rogers @ 2025-09-26 16:21 UTC (permalink / raw)
To: Qiao Zhao
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Adrian Hunter, Kan Liang, Athira Rajeev, Chun-Tse Shao,
James Clark, Howard Chu, linux-kernel, linux-perf-users
On Fri, Sep 26, 2025 at 2:00 AM Qiao Zhao <qzhao@redhat.com> wrote:
>
> Hi Ian,
>
> I tested your patch (latest linux-next code + your patch) on hybrid
> CPU machine {CPU Model name: 12th Gen Intel(R) Core(TM) i7-12800HE}
> and failed,
Hi Qiao,
in your output is:
uncore_imc_free_running_0/uncore_imc_free_running,data_total/
ie the uncore PMU is reported twice. This is fixed in the immediately
prior patch in this series:
https://lore.kernel.org/lkml/20250918222202.1353854-3-irogers@google.com/
Thanks,
Ian
> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> # perf test -vv "perf stat events uniquifying"
> 95: perf stat events uniquifying:
> --- start ---
> test child forked, pid 21799
> Uniquification of PMU sysfs events test
> Testing event uncore_imc_free_running/data_read/ is uniquified to
> uncore_imc_free_running_0/data_read/
> Uniquification of PMU sysfs events test [Failed]
> # started on Fri Sep 26 04:49:54 2025
>
>
> Performance counter stats for 'system wide':
>
> CPU0 1.47 MiB
> uncore_imc_free_running_0/uncore_imc_free_running,data_read/
> CPU0 1.47 MiB
> uncore_imc_free_running_1/uncore_imc_free_running,data_read/
>
> 0.000925108 seconds time elapsed
>
> Testing event uncore_imc_free_running/data_total/ is uniquified to
> uncore_imc_free_running_0/data_total/
> Uniquification of PMU sysfs events test [Failed]
> # started on Fri Sep 26 04:49:54 2025
>
>
> Performance counter stats for 'system wide':
>
> CPU0 0.59 MiB
> uncore_imc_free_running_0/uncore_imc_free_running,data_total/
> CPU0 0.58 MiB
> uncore_imc_free_running_1/uncore_imc_free_running,data_total/
>
> 0.000969877 seconds time elapsed
>
> Testing event uncore_imc_free_running/data_write/ is uniquified to
> uncore_imc_free_running_0/data_write/
> Uniquification of PMU sysfs events test [Failed]
> # started on Fri Sep 26 04:49:54 2025
>
>
> Performance counter stats for 'system wide':
>
> CPU0 0.00 MiB
> uncore_imc_free_running_0/uncore_imc_free_running,data_write/
> CPU0 0.00 MiB
> uncore_imc_free_running_1/uncore_imc_free_running,data_write/
>
> 0.001183888 seconds time elapsed
>
> Testing event uncore_imc_free_running/data_read/ is uniquified to
> uncore_imc_free_running_1/data_read/
> Uniquification of PMU sysfs events test [Failed]
> # started on Fri Sep 26 04:49:54 2025
>
>
> Performance counter stats for 'system wide':
>
> CPU0 0.29 MiB
> uncore_imc_free_running_0/uncore_imc_free_running,data_read/
> CPU0 0.29 MiB
> uncore_imc_free_running_1/uncore_imc_free_running,data_read/
>
> 0.000710088 seconds time elapsed
>
> Testing event uncore_imc_free_running/data_total/ is uniquified to
> uncore_imc_free_running_1/data_total/
> Uniquification of PMU sysfs events test [Failed]
> # started on Fri Sep 26 04:49:54 2025
>
>
> Performance counter stats for 'system wide':
>
> CPU0 0.62 MiB
> uncore_imc_free_running_0/uncore_imc_free_running,data_total/
> CPU0 0.67 MiB
> uncore_imc_free_running_1/uncore_imc_free_running,data_total/
>
> 0.000959074 seconds time elapsed
>
> Testing event uncore_imc_free_running/data_write/ is uniquified to
> uncore_imc_free_running_1/data_write/
> Uniquification of PMU sysfs events test [Failed]
> # started on Fri Sep 26 04:49:54 2025
>
>
> Performance counter stats for 'system wide':
>
> CPU0 0.23 MiB
> uncore_imc_free_running_0/uncore_imc_free_running,data_write/
> CPU0 0.23 MiB
> uncore_imc_free_running_1/uncore_imc_free_running,data_write/
>
> 0.000775028 seconds time elapsed
>
> ---- end(-1) ----
> 95: perf stat events uniquifying : FAILED!
> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> # ls -la /sys/bus/event_source/devices/uncore_imc_free_running_*/events/
> /sys/bus/event_source/devices/uncore_imc_free_running_0/events/:
> total 0
> drwxr-xr-x. 2 root root 0 Sep 26 04:57 .
> drwxr-xr-x. 5 root root 0 Sep 26 01:49 ..
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.scale
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.unit
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.scale
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.unit
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.scale
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.unit
>
> /sys/bus/event_source/devices/uncore_imc_free_running_1/events/:
> total 0
> drwxr-xr-x. 2 root root 0 Sep 26 04:57 .
> drwxr-xr-x. 5 root root 0 Sep 26 01:49 ..
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.scale
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.unit
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.scale
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.unit
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.scale
> -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.unit
>
> - Qiao
>
> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>
>
> On Fri, Sep 19, 2025 at 6:22 AM Ian Rogers <irogers@google.com> wrote:
> >
> > The detection of uncore_imc may happen for free running PMUs and the
> > clockticks event may be present on uncore_clock. Rewrite the test to
> > detect duplicated/deduplicated events from perf list, not hardcoded to
> > uncore_imc.
> >
> > If perf stat fails then assume it is permissions and skip the test.
> >
> > Fixes: 070b315333ee ("perf test: Restrict uniquifying test to machines with 'uncore_imc'")
> > Signed-off-by: Ian Rogers <irogers@google.com>
> > ---
> > .../tests/shell/stat+event_uniquifying.sh | 109 ++++++++----------
> > 1 file changed, 49 insertions(+), 60 deletions(-)
> >
> > diff --git a/tools/perf/tests/shell/stat+event_uniquifying.sh b/tools/perf/tests/shell/stat+event_uniquifying.sh
> > index bf54bd6c3e2e..b5dec6b6da36 100755
> > --- a/tools/perf/tests/shell/stat+event_uniquifying.sh
> > +++ b/tools/perf/tests/shell/stat+event_uniquifying.sh
> > @@ -4,74 +4,63 @@
> >
> > set -e
> >
> > -stat_output=$(mktemp /tmp/__perf_test.stat_output.XXXXX)
> > -perf_tool=perf
> > err=0
> > +stat_output=$(mktemp /tmp/__perf_test.stat_output.XXXXX)
> >
> > -test_event_uniquifying() {
> > - # We use `clockticks` in `uncore_imc` to verify the uniquify behavior.
> > - pmu="uncore_imc"
> > - event="clockticks"
> > -
> > - # If the `-A` option is added, the event should be uniquified.
> > - #
> > - # $perf list -v clockticks
> > - #
> > - # List of pre-defined events (to be used in -e or -M):
> > - #
> > - # uncore_imc_0/clockticks/ [Kernel PMU event]
> > - # uncore_imc_1/clockticks/ [Kernel PMU event]
> > - # uncore_imc_2/clockticks/ [Kernel PMU event]
> > - # uncore_imc_3/clockticks/ [Kernel PMU event]
> > - # uncore_imc_4/clockticks/ [Kernel PMU event]
> > - # uncore_imc_5/clockticks/ [Kernel PMU event]
> > - #
> > - # ...
> > - #
> > - # $perf stat -e clockticks -A -- true
> > - #
> > - # Performance counter stats for 'system wide':
> > - #
> > - # CPU0 3,773,018 uncore_imc_0/clockticks/
> > - # CPU0 3,609,025 uncore_imc_1/clockticks/
> > - # CPU0 0 uncore_imc_2/clockticks/
> > - # CPU0 3,230,009 uncore_imc_3/clockticks/
> > - # CPU0 3,049,897 uncore_imc_4/clockticks/
> > - # CPU0 0 uncore_imc_5/clockticks/
> > - #
> > - # 0.002029828 seconds time elapsed
> > -
> > - echo "stat event uniquifying test"
> > - uniquified_event_array=()
> > +cleanup() {
> > + rm -f "${stat_output}"
> >
> > - # Skip if the machine does not have `uncore_imc` device.
> > - if ! ${perf_tool} list pmu | grep -q ${pmu}; then
> > - echo "Target does not support PMU ${pmu} [Skipped]"
> > - err=2
> > - return
> > - fi
> > + trap - EXIT TERM INT
> > +}
> >
> > - # Check how many uniquified events.
> > - while IFS= read -r line; do
> > - uniquified_event=$(echo "$line" | awk '{print $1}')
> > - uniquified_event_array+=("${uniquified_event}")
> > - done < <(${perf_tool} list -v ${event} | grep ${pmu})
> > +trap_cleanup() {
> > + echo "Unexpected signal in ${FUNCNAME[1]}"
> > + cleanup
> > + exit 1
> > +}
> > +trap trap_cleanup EXIT TERM INT
> >
> > - perf_command="${perf_tool} stat -e $event -A -o ${stat_output} -- true"
> > - $perf_command
> > +test_event_uniquifying() {
> > + echo "Uniquification of PMU sysfs events test"
> >
> > - # Check the output contains all uniquified events.
> > - for uniquified_event in "${uniquified_event_array[@]}"; do
> > - if ! cat "${stat_output}" | grep -q "${uniquified_event}"; then
> > - echo "Event is not uniquified [Failed]"
> > - echo "${perf_command}"
> > - cat "${stat_output}"
> > - err=1
> > - break
> > - fi
> > + # Read events from perf list with and without -v. With -v the duplicate PMUs
> > + # aren't deduplicated. Note, json events are listed by perf list without a
> > + # PMU.
> > + read -ra pmu_events <<< "$(perf list --raw pmu)"
> > + read -ra pmu_v_events <<< "$(perf list -v --raw pmu)"
> > + # For all non-deduplicated events.
> > + for pmu_v_event in "${pmu_v_events[@]}"; do
> > + # If the event matches an event in the deduplicated events then it musn't
> > + # be an event with duplicate PMUs, continue the outer loop.
> > + for pmu_event in "${pmu_events[@]}"; do
> > + if [[ "$pmu_v_event" == "$pmu_event" ]]; then
> > + continue 2
> > + fi
> > + done
> > + # Strip the suffix from the non-deduplicated event's PMU.
> > + event=$(echo "$pmu_v_event" | sed -E 's/_[0-9]+//')
> > + for pmu_event in "${pmu_events[@]}"; do
> > + if [[ "$event" == "$pmu_event" ]]; then
> > + echo "Testing event ${event} is uniquified to ${pmu_v_event}"
> > + if ! perf stat -e "$event" -A -o ${stat_output} -- true; then
> > + echo "Error running perf stat for event '$event' [Skip]"
> > + if [ $err = 0 ]; then
> > + err=2
> > + fi
> > + continue
> > + fi
> > + # Ensure the non-deduplicated event appears in the output.
> > + if ! grep -q "${pmu_v_event}" "${stat_output}"; then
> > + echo "Uniquification of PMU sysfs events test [Failed]"
> > + cat "${stat_output}"
> > + err=1
> > + fi
> > + break
> > + fi
> > + done
> > done
> > }
> >
> > test_event_uniquifying
> > -rm -f "${stat_output}"
> > +cleanup
> > exit $err
> > --
> > 2.51.0.470.ga7dc726c21-goog
> >
> >
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 3/3] perf test: Avoid uncore_imc/clockticks in uniquification test
2025-09-26 16:21 ` Ian Rogers
@ 2025-09-29 2:39 ` Qiao Zhao
0 siblings, 0 replies; 8+ messages in thread
From: Qiao Zhao @ 2025-09-29 2:39 UTC (permalink / raw)
To: Ian Rogers
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Adrian Hunter, Kan Liang, Athira Rajeev, Chun-Tse Shao,
James Clark, Howard Chu, linux-kernel, linux-perf-users
Hi Ian,
Cool! After applied your patch "[PATCH v2 2/3] perf evsel: Fix
uniquification when PMU given without suffix" and "[PATCH v2 3/3]
perf test: Avoid uncore_imc/clockticks in uniquification test",
the uniquifying testing passed on both Intel hybrid and non-hybrid machine:
hybrid CPU machine:
>>>>>>>>>>>>>>>>>>
# ./perf test -vv 96
96: perf stat events uniquifying:
--- start ---
test child forked, pid 40541
Uniquification of PMU sysfs events test
Testing event uncore_imc_free_running/data_read/ is uniquified to
uncore_imc_free_running_0/data_read/
Testing event uncore_imc_free_running/data_total/ is uniquified to
uncore_imc_free_running_0/data_total/
Testing event uncore_imc_free_running/data_write/ is uniquified to
uncore_imc_free_running_0/data_write/
Testing event uncore_imc_free_running/data_read/ is uniquified to
uncore_imc_free_running_1/data_read/
Testing event uncore_imc_free_running/data_total/ is uniquified to
uncore_imc_free_running_1/data_total/
Testing event uncore_imc_free_running/data_write/ is uniquified to
uncore_imc_free_running_1/data_write/
---- end(0) ----
96: perf stat events uniquifying : Ok
>>>>>>>>>>>>>>>>>>
non-hybrid CPU machine:
>>>>>>>>>>>>>>>>>>
# ./perf test -vv 96
96: perf stat events uniquifying:
--- start ---
test child forked, pid 114458
Uniquification of PMU sysfs events test
Testing event uncore_iio_free_running/bw_in_port0/ is uniquified to
uncore_iio_free_running_0/bw_in_port0/
Testing event uncore_iio_free_running/bw_in_port1/ is uniquified to
uncore_iio_free_running_0/bw_in_port1/
Testing event uncore_iio_free_running/bw_in_port2/ is uniquified to
uncore_iio_free_running_0/bw_in_port2/
Testing event uncore_iio_free_running/bw_in_port3/ is uniquified to
uncore_iio_free_running_0/bw_in_port3/
Testing event uncore_iio_free_running/bw_in_port4/ is uniquified to
uncore_iio_free_running_0/bw_in_port4/
Testing event uncore_iio_free_running/bw_in_port5/ is uniquified to
uncore_iio_free_running_0/bw_in_port5/
Testing event uncore_iio_free_running/bw_in_port6/ is uniquified to
uncore_iio_free_running_0/bw_in_port6/
Testing event uncore_iio_free_running/bw_in_port7/ is uniquified to
uncore_iio_free_running_0/bw_in_port7/
Testing event uncore_iio_free_running/ioclk/ is uniquified to
uncore_iio_free_running_0/ioclk/
... ...
Testing event uncore_imc_free_running/dclk/ is uniquified to
uncore_imc_free_running_0/dclk/
Testing event uncore_imc_free_running/rpq_cycles/ is uniquified to
uncore_imc_free_running_0/rpq_cycles/
Testing event uncore_imc_free_running/wpq_cycles/ is uniquified to
uncore_imc_free_running_0/wpq_cycles/
Testing event uncore_imc_free_running/dclk/ is uniquified to
uncore_imc_free_running_1/dclk/
Testing event uncore_imc_free_running/rpq_cycles/ is uniquified to
uncore_imc_free_running_1/rpq_cycles/
Testing event uncore_imc_free_running/wpq_cycles/ is uniquified to
uncore_imc_free_running_1/wpq_cycles/
Testing event uncore_imc_free_running/dclk/ is uniquified to
uncore_imc_free_running_2/dclk/
Testing event uncore_imc_free_running/rpq_cycles/ is uniquified to
uncore_imc_free_running_2/rpq_cycles/
Testing event uncore_imc_free_running/wpq_cycles/ is uniquified to
uncore_imc_free_running_2/wpq_cycles/
Testing event uncore_imc_free_running/dclk/ is uniquified to
uncore_imc_free_running_3/dclk/
Testing event uncore_imc_free_running/rpq_cycles/ is uniquified to
uncore_imc_free_running_3/rpq_cycles/
Testing event uncore_imc_free_running/wpq_cycles/ is uniquified to
uncore_imc_free_running_3/wpq_cycles/
---- end(0) ----
96: perf stat events uniquifying : Ok
>>>>>>>>>>>>>>>>>>
Tested-by: Qiao Zhao <qzhao@redhat.com>
On Fri, Sep 26, 2025 at 9:22 AM Ian Rogers <irogers@google.com> wrote:
>
> On Fri, Sep 26, 2025 at 2:00 AM Qiao Zhao <qzhao@redhat.com> wrote:
> >
> > Hi Ian,
> >
> > I tested your patch (latest linux-next code + your patch) on hybrid
> > CPU machine {CPU Model name: 12th Gen Intel(R) Core(TM) i7-12800HE}
> > and failed,
>
> Hi Qiao,
>
> in your output is:
> uncore_imc_free_running_0/uncore_imc_free_running,data_total/
> ie the uncore PMU is reported twice. This is fixed in the immediately
> prior patch in this series:
> https://lore.kernel.org/lkml/20250918222202.1353854-3-irogers@google.com/
>
> Thanks,
> Ian
>
> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > # perf test -vv "perf stat events uniquifying"
> > 95: perf stat events uniquifying:
> > --- start ---
> > test child forked, pid 21799
> > Uniquification of PMU sysfs events test
> > Testing event uncore_imc_free_running/data_read/ is uniquified to
> > uncore_imc_free_running_0/data_read/
> > Uniquification of PMU sysfs events test [Failed]
> > # started on Fri Sep 26 04:49:54 2025
> >
> >
> > Performance counter stats for 'system wide':
> >
> > CPU0 1.47 MiB
> > uncore_imc_free_running_0/uncore_imc_free_running,data_read/
> > CPU0 1.47 MiB
> > uncore_imc_free_running_1/uncore_imc_free_running,data_read/
> >
> > 0.000925108 seconds time elapsed
> >
> > Testing event uncore_imc_free_running/data_total/ is uniquified to
> > uncore_imc_free_running_0/data_total/
> > Uniquification of PMU sysfs events test [Failed]
> > # started on Fri Sep 26 04:49:54 2025
> >
> >
> > Performance counter stats for 'system wide':
> >
> > CPU0 0.59 MiB
> > uncore_imc_free_running_0/uncore_imc_free_running,data_total/
> > CPU0 0.58 MiB
> > uncore_imc_free_running_1/uncore_imc_free_running,data_total/
> >
> > 0.000969877 seconds time elapsed
> >
> > Testing event uncore_imc_free_running/data_write/ is uniquified to
> > uncore_imc_free_running_0/data_write/
> > Uniquification of PMU sysfs events test [Failed]
> > # started on Fri Sep 26 04:49:54 2025
> >
> >
> > Performance counter stats for 'system wide':
> >
> > CPU0 0.00 MiB
> > uncore_imc_free_running_0/uncore_imc_free_running,data_write/
> > CPU0 0.00 MiB
> > uncore_imc_free_running_1/uncore_imc_free_running,data_write/
> >
> > 0.001183888 seconds time elapsed
> >
> > Testing event uncore_imc_free_running/data_read/ is uniquified to
> > uncore_imc_free_running_1/data_read/
> > Uniquification of PMU sysfs events test [Failed]
> > # started on Fri Sep 26 04:49:54 2025
> >
> >
> > Performance counter stats for 'system wide':
> >
> > CPU0 0.29 MiB
> > uncore_imc_free_running_0/uncore_imc_free_running,data_read/
> > CPU0 0.29 MiB
> > uncore_imc_free_running_1/uncore_imc_free_running,data_read/
> >
> > 0.000710088 seconds time elapsed
> >
> > Testing event uncore_imc_free_running/data_total/ is uniquified to
> > uncore_imc_free_running_1/data_total/
> > Uniquification of PMU sysfs events test [Failed]
> > # started on Fri Sep 26 04:49:54 2025
> >
> >
> > Performance counter stats for 'system wide':
> >
> > CPU0 0.62 MiB
> > uncore_imc_free_running_0/uncore_imc_free_running,data_total/
> > CPU0 0.67 MiB
> > uncore_imc_free_running_1/uncore_imc_free_running,data_total/
> >
> > 0.000959074 seconds time elapsed
> >
> > Testing event uncore_imc_free_running/data_write/ is uniquified to
> > uncore_imc_free_running_1/data_write/
> > Uniquification of PMU sysfs events test [Failed]
> > # started on Fri Sep 26 04:49:54 2025
> >
> >
> > Performance counter stats for 'system wide':
> >
> > CPU0 0.23 MiB
> > uncore_imc_free_running_0/uncore_imc_free_running,data_write/
> > CPU0 0.23 MiB
> > uncore_imc_free_running_1/uncore_imc_free_running,data_write/
> >
> > 0.000775028 seconds time elapsed
> >
> > ---- end(-1) ----
> > 95: perf stat events uniquifying : FAILED!
> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> > # ls -la /sys/bus/event_source/devices/uncore_imc_free_running_*/events/
> > /sys/bus/event_source/devices/uncore_imc_free_running_0/events/:
> > total 0
> > drwxr-xr-x. 2 root root 0 Sep 26 04:57 .
> > drwxr-xr-x. 5 root root 0 Sep 26 01:49 ..
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.scale
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.unit
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.scale
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.unit
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.scale
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.unit
> >
> > /sys/bus/event_source/devices/uncore_imc_free_running_1/events/:
> > total 0
> > drwxr-xr-x. 2 root root 0 Sep 26 04:57 .
> > drwxr-xr-x. 5 root root 0 Sep 26 01:49 ..
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.scale
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_read.unit
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.scale
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_total.unit
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.scale
> > -r--r--r--. 1 root root 4096 Sep 26 01:49 data_write.unit
> >
> > - Qiao
> >
> > >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> >
> >
> > On Fri, Sep 19, 2025 at 6:22 AM Ian Rogers <irogers@google.com> wrote:
> > >
> > > The detection of uncore_imc may happen for free running PMUs and the
> > > clockticks event may be present on uncore_clock. Rewrite the test to
> > > detect duplicated/deduplicated events from perf list, not hardcoded to
> > > uncore_imc.
> > >
> > > If perf stat fails then assume it is permissions and skip the test.
> > >
> > > Fixes: 070b315333ee ("perf test: Restrict uniquifying test to machines with 'uncore_imc'")
> > > Signed-off-by: Ian Rogers <irogers@google.com>
> > > ---
> > > .../tests/shell/stat+event_uniquifying.sh | 109 ++++++++----------
> > > 1 file changed, 49 insertions(+), 60 deletions(-)
> > >
> > > diff --git a/tools/perf/tests/shell/stat+event_uniquifying.sh b/tools/perf/tests/shell/stat+event_uniquifying.sh
> > > index bf54bd6c3e2e..b5dec6b6da36 100755
> > > --- a/tools/perf/tests/shell/stat+event_uniquifying.sh
> > > +++ b/tools/perf/tests/shell/stat+event_uniquifying.sh
> > > @@ -4,74 +4,63 @@
> > >
> > > set -e
> > >
> > > -stat_output=$(mktemp /tmp/__perf_test.stat_output.XXXXX)
> > > -perf_tool=perf
> > > err=0
> > > +stat_output=$(mktemp /tmp/__perf_test.stat_output.XXXXX)
> > >
> > > -test_event_uniquifying() {
> > > - # We use `clockticks` in `uncore_imc` to verify the uniquify behavior.
> > > - pmu="uncore_imc"
> > > - event="clockticks"
> > > -
> > > - # If the `-A` option is added, the event should be uniquified.
> > > - #
> > > - # $perf list -v clockticks
> > > - #
> > > - # List of pre-defined events (to be used in -e or -M):
> > > - #
> > > - # uncore_imc_0/clockticks/ [Kernel PMU event]
> > > - # uncore_imc_1/clockticks/ [Kernel PMU event]
> > > - # uncore_imc_2/clockticks/ [Kernel PMU event]
> > > - # uncore_imc_3/clockticks/ [Kernel PMU event]
> > > - # uncore_imc_4/clockticks/ [Kernel PMU event]
> > > - # uncore_imc_5/clockticks/ [Kernel PMU event]
> > > - #
> > > - # ...
> > > - #
> > > - # $perf stat -e clockticks -A -- true
> > > - #
> > > - # Performance counter stats for 'system wide':
> > > - #
> > > - # CPU0 3,773,018 uncore_imc_0/clockticks/
> > > - # CPU0 3,609,025 uncore_imc_1/clockticks/
> > > - # CPU0 0 uncore_imc_2/clockticks/
> > > - # CPU0 3,230,009 uncore_imc_3/clockticks/
> > > - # CPU0 3,049,897 uncore_imc_4/clockticks/
> > > - # CPU0 0 uncore_imc_5/clockticks/
> > > - #
> > > - # 0.002029828 seconds time elapsed
> > > -
> > > - echo "stat event uniquifying test"
> > > - uniquified_event_array=()
> > > +cleanup() {
> > > + rm -f "${stat_output}"
> > >
> > > - # Skip if the machine does not have `uncore_imc` device.
> > > - if ! ${perf_tool} list pmu | grep -q ${pmu}; then
> > > - echo "Target does not support PMU ${pmu} [Skipped]"
> > > - err=2
> > > - return
> > > - fi
> > > + trap - EXIT TERM INT
> > > +}
> > >
> > > - # Check how many uniquified events.
> > > - while IFS= read -r line; do
> > > - uniquified_event=$(echo "$line" | awk '{print $1}')
> > > - uniquified_event_array+=("${uniquified_event}")
> > > - done < <(${perf_tool} list -v ${event} | grep ${pmu})
> > > +trap_cleanup() {
> > > + echo "Unexpected signal in ${FUNCNAME[1]}"
> > > + cleanup
> > > + exit 1
> > > +}
> > > +trap trap_cleanup EXIT TERM INT
> > >
> > > - perf_command="${perf_tool} stat -e $event -A -o ${stat_output} -- true"
> > > - $perf_command
> > > +test_event_uniquifying() {
> > > + echo "Uniquification of PMU sysfs events test"
> > >
> > > - # Check the output contains all uniquified events.
> > > - for uniquified_event in "${uniquified_event_array[@]}"; do
> > > - if ! cat "${stat_output}" | grep -q "${uniquified_event}"; then
> > > - echo "Event is not uniquified [Failed]"
> > > - echo "${perf_command}"
> > > - cat "${stat_output}"
> > > - err=1
> > > - break
> > > - fi
> > > + # Read events from perf list with and without -v. With -v the duplicate PMUs
> > > + # aren't deduplicated. Note, json events are listed by perf list without a
> > > + # PMU.
> > > + read -ra pmu_events <<< "$(perf list --raw pmu)"
> > > + read -ra pmu_v_events <<< "$(perf list -v --raw pmu)"
> > > + # For all non-deduplicated events.
> > > + for pmu_v_event in "${pmu_v_events[@]}"; do
> > > + # If the event matches an event in the deduplicated events then it musn't
> > > + # be an event with duplicate PMUs, continue the outer loop.
> > > + for pmu_event in "${pmu_events[@]}"; do
> > > + if [[ "$pmu_v_event" == "$pmu_event" ]]; then
> > > + continue 2
> > > + fi
> > > + done
> > > + # Strip the suffix from the non-deduplicated event's PMU.
> > > + event=$(echo "$pmu_v_event" | sed -E 's/_[0-9]+//')
> > > + for pmu_event in "${pmu_events[@]}"; do
> > > + if [[ "$event" == "$pmu_event" ]]; then
> > > + echo "Testing event ${event} is uniquified to ${pmu_v_event}"
> > > + if ! perf stat -e "$event" -A -o ${stat_output} -- true; then
> > > + echo "Error running perf stat for event '$event' [Skip]"
> > > + if [ $err = 0 ]; then
> > > + err=2
> > > + fi
> > > + continue
> > > + fi
> > > + # Ensure the non-deduplicated event appears in the output.
> > > + if ! grep -q "${pmu_v_event}" "${stat_output}"; then
> > > + echo "Uniquification of PMU sysfs events test [Failed]"
> > > + cat "${stat_output}"
> > > + err=1
> > > + fi
> > > + break
> > > + fi
> > > + done
> > > done
> > > }
> > >
> > > test_event_uniquifying
> > > -rm -f "${stat_output}"
> > > +cleanup
> > > exit $err
> > > --
> > > 2.51.0.470.ga7dc726c21-goog
> > >
> > >
> >
>
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-09-29 2:39 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-18 22:21 [PATCH v2 0/3] Test/uniquification related fixes Ian Rogers
2025-09-18 22:22 ` [PATCH v2 1/3] perf test: Don't leak workload gopipe in PERF_RECORD_* Ian Rogers
2025-09-18 22:22 ` [PATCH v2 2/3] perf evsel: Fix uniquification when PMU given without suffix Ian Rogers
2025-09-18 22:22 ` [PATCH v2 3/3] perf test: Avoid uncore_imc/clockticks in uniquification test Ian Rogers
2025-09-26 9:00 ` Qiao Zhao
2025-09-26 16:21 ` Ian Rogers
2025-09-29 2:39 ` Qiao Zhao
2025-09-19 19:51 ` [PATCH v2 0/3] Test/uniquification related fixes Arnaldo Carvalho de Melo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).