tools/perf/Makefile.perf | 21 +- tools/perf/arch/x86/util/intel-pt.c | 2 +- tools/perf/builtin-list.c | 34 +- tools/perf/builtin-record.c | 93 +- tools/perf/builtin-stat.c | 133 +- tools/perf/builtin-top.c | 8 +- tools/perf/pmu-events/Build | 24 +- .../arch/common/common/legacy-hardware.json | 72 + tools/perf/pmu-events/empty-pmu-events.c | 2771 ++++++++++++++++- tools/perf/pmu-events/jevents.py | 32 + tools/perf/pmu-events/make_legacy_cache.py | 129 + tools/perf/pmu-events/pmu-events.h | 1 + tools/perf/tests/code-reading.c | 2 +- tools/perf/tests/keep-tracking.c | 2 +- tools/perf/tests/parse-events.c | 2021 ++++++------ tools/perf/tests/perf-time-to-tsc.c | 4 +- tools/perf/tests/pmu-events.c | 24 +- tools/perf/tests/pmu.c | 3 +- tools/perf/tests/switch-tracking.c | 2 +- tools/perf/util/evlist.c | 18 +- tools/perf/util/evsel.c | 21 +- tools/perf/util/parse-events.c | 282 +- tools/perf/util/parse-events.h | 22 +- tools/perf/util/parse-events.l | 54 +- tools/perf/util/parse-events.y | 114 +- tools/perf/util/perf_api_probe.c | 27 +- tools/perf/util/pmu.c | 309 +- tools/perf/util/print-events.c | 112 - tools/perf/util/print-events.h | 4 - 29 files changed, 4504 insertions(+), 1837 deletions(-) create mode 100644 tools/perf/pmu-events/arch/common/common/legacy-hardware.json create mode 100755 tools/perf/pmu-events/make_legacy_cache.py
Mirroring similar work for software events in commit 6e9fa4131abb
("perf parse-events: Remove non-json software events"). These changes
migrate the legacy hardware and cache events to json. With no hard
coded legacy hardware or cache events the wild card, case
insensitivity, etc. is consistent for events. This does, however, mean
events like cycles will wild card against all PMUs. A change doing the
same was originally posted and merged from:
https://lore.kernel.org/r/20240416061533.921723-10-irogers@google.com
and reverted by Linus in commit 4f1b067359ac ("Revert "perf
parse-events: Prefer sysfs/JSON hardware events over legacy"") due to
his dislike for the cycles behavior on ARM with perf record. Earlier
patches in this series make perf record event opening failures
non-fatal and hide the cycles event's failure to open on ARM in perf
record, so it is expected the behavior will now be transparent in perf
record on ARM. perf stat with a cycles event will wildcard open the
event on all PMUs, however, with default events the cycles event will
only be opened on core PMUs.
The key motivation for these patches is so that if, for example, you
run `perf stat -e cpu-cycles ...` on a hybrid x86 and the results are
printed out with "cpu_core/cpu-cycles/" and "cpu_atom/cpu-cycles/",
the perf_event_attr for cpu-cycles and cpu_core/cpu-cycles/ be the
same, similarly for the cpu_atom event. Prior to these patches the
event with a PMU prefers sysfs/json over legacy encodings while with
no PMU legacy encodings are preferred - these are different encodings
on x86.
The change to support legacy events with PMUs was done to clean up
Intel's hybrid PMU implementation. Having sysfs/json events with
increased priority to legacy was requested by Mark Rutland
<mark.rutland@arm.com> to fix Apple-M PMU issues wrt broken legacy
events on that PMU. It is believed the PMU driver is now fixed, but
this has only been confirmed on ARM Juno boards. It was requested that
RISC-V be able to add events to the perf tool json so the PMU driver
didn't need to map legacy events to config encodings:
https://lore.kernel.org/lkml/20240217005738.3744121-1-atishp@rivosinc.com/
This patch series achieves this.
A previous series of patches decreasing legacy hardware event
priorities was posted in:
https://lore.kernel.org/lkml/20250416045117.876775-1-irogers@google.com/
Namhyung Kim <namhyung@kernel.org> mentioned that hardware and
software events can be implemented similarly:
https://lore.kernel.org/lkml/aIJmJns2lopxf3EK@google.com/
and this patch series achieves this.
Note, patch 2 (perf parse-events: Fix legacy cache events if event is
duplicated in a PMU) fixes a function deleted by patch 17 (perf
parse-events: Remove hard coded legacy hardware and cache
parsing). Adding the json exposed an issue when legacy cache (not
legacy hardware) and sysfs/json events exist. The fix is necessary to
keep tests passing through the series. It is also posted for backports
to stable trees.
The perf list behavior includes a lot more information and events. The
before behavior on a hybrid alderlake is:
```
$ perf list hw
List of pre-defined events (to be used in -e or -M):
branch-instructions OR branches [Hardware event]
branch-misses [Hardware event]
bus-cycles [Hardware event]
cache-misses [Hardware event]
cache-references [Hardware event]
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
ref-cycles [Hardware event]
$ perf list hwcache
List of pre-defined events (to be used in -e or -M):
cache:
L1-dcache-loads OR cpu_atom/L1-dcache-loads/
L1-dcache-stores OR cpu_atom/L1-dcache-stores/
L1-icache-loads OR cpu_atom/L1-icache-loads/
L1-icache-load-misses OR cpu_atom/L1-icache-load-misses/
LLC-loads OR cpu_atom/LLC-loads/
LLC-load-misses OR cpu_atom/LLC-load-misses/
LLC-stores OR cpu_atom/LLC-stores/
LLC-store-misses OR cpu_atom/LLC-store-misses/
dTLB-loads OR cpu_atom/dTLB-loads/
dTLB-load-misses OR cpu_atom/dTLB-load-misses/
dTLB-stores OR cpu_atom/dTLB-stores/
dTLB-store-misses OR cpu_atom/dTLB-store-misses/
iTLB-load-misses OR cpu_atom/iTLB-load-misses/
branch-loads OR cpu_atom/branch-loads/
branch-load-misses OR cpu_atom/branch-load-misses/
L1-dcache-loads OR cpu_core/L1-dcache-loads/
L1-dcache-load-misses OR cpu_core/L1-dcache-load-misses/
L1-dcache-stores OR cpu_core/L1-dcache-stores/
L1-icache-load-misses OR cpu_core/L1-icache-load-misses/
LLC-loads OR cpu_core/LLC-loads/
LLC-load-misses OR cpu_core/LLC-load-misses/
LLC-stores OR cpu_core/LLC-stores/
LLC-store-misses OR cpu_core/LLC-store-misses/
dTLB-loads OR cpu_core/dTLB-loads/
dTLB-load-misses OR cpu_core/dTLB-load-misses/
dTLB-stores OR cpu_core/dTLB-stores/
dTLB-store-misses OR cpu_core/dTLB-store-misses/
iTLB-load-misses OR cpu_core/iTLB-load-misses/
branch-loads OR cpu_core/branch-loads/
branch-load-misses OR cpu_core/branch-load-misses/
node-loads OR cpu_core/node-loads/
node-load-misses OR cpu_core/node-load-misses/
```
and after it is:
```
$ perf list hw
legacy hardware:
branch-instructions
[Retired branch instructions [This event is an alias of branches].
Unit: cpu_atom]
branch-misses
[Mispredicted branch instructions. Unit: cpu_atom]
branches
[Retired branch instructions [This event is an alias of
branch-instructions]. Unit: cpu_atom]
bus-cycles
[Bus cycles,which can be different from total cycles. Unit: cpu_atom]
cache-misses
[Cache misses. Usually this indicates Last Level Cache misses; this is
intended to be used in conjunction with the
PERF_COUNT_HW_CACHE_REFERENCES event to calculate cache miss rates.
Unit: cpu_atom]
cache-references
[Cache accesses. Usually this indicates Last Level Cache accesses but
this may vary depending on your CPU. This may include prefetches and
coherency messages; again this depends on the design of your CPU.
Unit: cpu_atom]
cpu-cycles
[Total cycles. Be wary of what happens during CPU frequency scaling
[This event is an alias of cycles]. Unit: cpu_atom]
cycles
[Total cycles. Be wary of what happens during CPU frequency scaling
[This event is an alias of cpu-cycles]. Unit: cpu_atom]
instructions
[Retired instructions. Be careful,these can be affected by various
issues,most notably hardware interrupt counts. Unit: cpu_atom]
ref-cycles
[Total cycles; not affected by CPU frequency scaling. Unit: cpu_atom]
branch-instructions
[Retired branch instructions [This event is an alias of branches].
Unit: cpu_core]
branch-misses
[Mispredicted branch instructions. Unit: cpu_core]
branches
[Retired branch instructions [This event is an alias of
branch-instructions]. Unit: cpu_core]
bus-cycles
[Bus cycles,which can be different from total cycles. Unit: cpu_core]
cache-misses
[Cache misses. Usually this indicates Last Level Cache misses; this is
intended to be used in conjunction with the
PERF_COUNT_HW_CACHE_REFERENCES event to calculate cache miss rates.
Unit: cpu_core]
cache-references
[Cache accesses. Usually this indicates Last Level Cache accesses but
this may vary depending on your CPU. This may include prefetches and
coherency messages; again this depends on the design of your CPU.
Unit: cpu_core]
cpu-cycles
[Total cycles. Be wary of what happens during CPU frequency scaling
[This event is an alias of cycles]. Unit: cpu_core]
cycles
[Total cycles. Be wary of what happens during CPU frequency scaling
[This event is an alias of cpu-cycles]. Unit: cpu_core]
instructions
[Retired instructions. Be careful,these can be affected by various
issues,most notably hardware interrupt counts. Unit: cpu_core]
ref-cycles
[Total cycles; not affected by CPU frequency scaling. Unit: cpu_core]
$ perf list hwcache
legacy cache:
branch-load-misses
[Branch prediction unit read misses. Unit: cpu_atom]
branch-loads
[Branch prediction unit read accesses. Unit: cpu_atom]
dtlb-load-misses
[Data TLB read misses. Unit: cpu_atom]
dtlb-loads
[Data TLB read accesses. Unit: cpu_atom]
dtlb-store-misses
[Data TLB write misses. Unit: cpu_atom]
dtlb-stores
[Data TLB write accesses. Unit: cpu_atom]
itlb-load-misses
[Instruction TLB read misses. Unit: cpu_atom]
l1-dcache-loads
[Level 1 data cache read accesses. Unit: cpu_atom]
l1-dcache-stores
[Level 1 data cache write accesses. Unit: cpu_atom]
l1-icache-load-misses
[Level 1 instruction cache read misses. Unit: cpu_atom]
l1-icache-loads
[Level 1 instruction cache read accesses. Unit: cpu_atom]
llc-load-misses
[Last level cache read misses. Unit: cpu_atom]
llc-loads
[Last level cache read accesses. Unit: cpu_atom]
llc-store-misses
[Last level cache write misses. Unit: cpu_atom]
llc-stores
[Last level cache write accesses. Unit: cpu_atom]
branch-load-misses
[Branch prediction unit read misses. Unit: cpu_core]
branch-loads
[Branch prediction unit read accesses. Unit: cpu_core]
dtlb-load-misses
[Data TLB read misses. Unit: cpu_core]
dtlb-loads
[Data TLB read accesses. Unit: cpu_core]
dtlb-store-misses
[Data TLB write misses. Unit: cpu_core]
dtlb-stores
[Data TLB write accesses. Unit: cpu_core]
itlb-load-misses
[Instruction TLB read misses. Unit: cpu_core]
l1-dcache-load-misses
[Level 1 data cache read misses. Unit: cpu_core]
l1-dcache-loads
[Level 1 data cache read accesses. Unit: cpu_core]
l1-dcache-stores
[Level 1 data cache write accesses. Unit: cpu_core]
l1-icache-load-misses
[Level 1 instruction cache read misses. Unit: cpu_core]
llc-load-misses
[Last level cache read misses. Unit: cpu_core]
llc-loads
[Last level cache read accesses. Unit: cpu_core]
llc-store-misses
[Last level cache write misses. Unit: cpu_core]
llc-stores
[Last level cache write accesses. Unit: cpu_core]
node-load-misses
[Local memory read misses. Unit: cpu_core]
node-loads
[Local memory read accesses. Unit: cpu_core]
```
v7. Rebase resolving conflicts with the ratio-to-prev changes and test
updates. Drop the patch "perf stat: Allow retry for default
events" as the series with "perf stat: Refactor retry/skip/fatal
error handling" landed from:
https://lore.kernel.org/lkml/20251002220727.1889799-2-irogers@google.com/
v6. Fix x86 hybrid mismatched number of evsels for the case a PMU is
specified. Add patches to make failures in the parse-events test
easier to diagnose. Reorder the perf stat default events patch to
come earlier.
https://lore.kernel.org/lkml/20250923223312.238185-1-irogers@google.com/
v5. Add patch for retrying default events, fixing regression when
non-root and paranoid. Make cycles to cpu-cycles test event change
(to avoid non-core ARM events) the default on all architectures
(suggested by Namhyung). Switch all non-test cases to specifying a
PMU. Improvements to the parse-events test including core PMU
parsing support for architectures without a "cpu" PMU.
https://lore.kernel.org/lkml/20250923041844.400164-1-irogers@google.com/
v4: Fixes for matching hard coded metrics in stat-shadow. Make the
default "cycles" event string on ARM "cpu-cycles" which is the
same legacy event but avoids name collisions on ARM PMUs. To
support this, use evlist__new_default for the no command line
event case in `perf record` and `perf top`. Make
evlist__new_default only scan core PMUs.
https://lore.kernel.org/lkml/20250914181121.1952748-1-irogers@google.com/#t
v3: Deprecate the legacy cache events that aren't shown in the
previous perf list to avoid the perf list output being too verbose.
https://lore.kernel.org/lkml/20250828205930.4007284-1-irogers@google.com/
v2: Additional details to the cover letter. Credit to Vince Weaver
added to the commit message for the event details. Additional
patches to clean up perf_pmu new_alias by removing an unused term
scanner argument and avoid stdio usage.
https://lore.kernel.org/lkml/20250828163225.3839073-1-irogers@google.com/
v1: https://lore.kernel.org/lkml/20250828064231.1762997-1-irogers@google.com/
Ian Rogers (27):
perf parse-events: Fix legacy cache events if event is duplicated in a
PMU
perf perf_api_probe: Avoid scanning all PMUs, try software PMU first
perf stat: Avoid wildcarding PMUs for default events
perf record: Skip don't fail for events that don't open
perf jevents: Support copying the source json files to OUTPUT
perf pmu: Don't eagerly parse event terms
perf parse-events: Remove unused FILE input argument to scanner
perf pmu: Use fd rather than FILE from new_alias
perf pmu: Factor term parsing into a perf_event_attr into a helper
perf parse-events: Add terms for legacy hardware and cache config
values
perf jevents: Add legacy json terms and default_core event table
helper
perf pmu: Add and use legacy_terms in alias information
perf jevents: Add legacy-hardware and legacy-cache json
perf print-events: Remove print_hwcache_events
perf print-events: Remove print_symbol_events
perf parse-events: Remove hard coded legacy hardware and cache parsing
perf record: Use evlist__new_default when no events specified
perf top: Use evlist__new_default when no events specified
perf evlist: Avoid scanning all PMUs for evlist__new_default
perf evsel: Improvements to __evsel__match
perf test parse-events: Use evsel__match for legacy events
perf test parse-events: Without a PMU use cpu-cycles rather than
cycles
perf test parse-events: Remove cpu PMU requirement
perf test: Switch cycles event to cpu-cycles
perf test: Clean up test_..config helpers
perf test parse-events: Add evlist test helper
perf test parse-events: Add evsel test helper
tools/perf/Makefile.perf | 21 +-
tools/perf/arch/x86/util/intel-pt.c | 2 +-
tools/perf/builtin-list.c | 34 +-
tools/perf/builtin-record.c | 93 +-
tools/perf/builtin-stat.c | 133 +-
tools/perf/builtin-top.c | 8 +-
tools/perf/pmu-events/Build | 24 +-
.../arch/common/common/legacy-hardware.json | 72 +
tools/perf/pmu-events/empty-pmu-events.c | 2771 ++++++++++++++++-
tools/perf/pmu-events/jevents.py | 32 +
tools/perf/pmu-events/make_legacy_cache.py | 129 +
tools/perf/pmu-events/pmu-events.h | 1 +
tools/perf/tests/code-reading.c | 2 +-
tools/perf/tests/keep-tracking.c | 2 +-
tools/perf/tests/parse-events.c | 2021 ++++++------
tools/perf/tests/perf-time-to-tsc.c | 4 +-
tools/perf/tests/pmu-events.c | 24 +-
tools/perf/tests/pmu.c | 3 +-
tools/perf/tests/switch-tracking.c | 2 +-
tools/perf/util/evlist.c | 18 +-
tools/perf/util/evsel.c | 21 +-
tools/perf/util/parse-events.c | 282 +-
tools/perf/util/parse-events.h | 22 +-
tools/perf/util/parse-events.l | 54 +-
tools/perf/util/parse-events.y | 114 +-
tools/perf/util/perf_api_probe.c | 27 +-
tools/perf/util/pmu.c | 309 +-
tools/perf/util/print-events.c | 112 -
tools/perf/util/print-events.h | 4 -
29 files changed, 4504 insertions(+), 1837 deletions(-)
create mode 100644 tools/perf/pmu-events/arch/common/common/legacy-hardware.json
create mode 100755 tools/perf/pmu-events/make_legacy_cache.py
--
2.51.0.618.g983fd99d29-goog
On 05/10/2025 7:24 pm, Ian Rogers wrote:
> Mirroring similar work for software events in commit 6e9fa4131abb
> ("perf parse-events: Remove non-json software events"). These changes
> migrate the legacy hardware and cache events to json. With no hard
> coded legacy hardware or cache events the wild card, case
> insensitivity, etc. is consistent for events. This does, however, mean
> events like cycles will wild card against all PMUs. A change doing the
> same was originally posted and merged from:
> https://lore.kernel.org/r/20240416061533.921723-10-irogers@google.com
> and reverted by Linus in commit 4f1b067359ac ("Revert "perf
> parse-events: Prefer sysfs/JSON hardware events over legacy"") due to
> his dislike for the cycles behavior on ARM with perf record. Earlier
> patches in this series make perf record event opening failures
> non-fatal and hide the cycles event's failure to open on ARM in perf
> record, so it is expected the behavior will now be transparent in perf
> record on ARM. perf stat with a cycles event will wildcard open the
> event on all PMUs, however, with default events the cycles event will
> only be opened on core PMUs.
>
Hi Ian,
The previous issues seem to be fixed, I don't see any Perf test
regressions or issues when there is an uncore PMU with a cycles event.
Tested-by: James Clark <james.clark@linaro.org>
On Wed, Oct 8, 2025 at 4:06 AM James Clark <james.clark@linaro.org> wrote:
> On 05/10/2025 7:24 pm, Ian Rogers wrote:
> > Mirroring similar work for software events in commit 6e9fa4131abb
> > ("perf parse-events: Remove non-json software events"). These changes
> > migrate the legacy hardware and cache events to json. With no hard
> > coded legacy hardware or cache events the wild card, case
> > insensitivity, etc. is consistent for events. This does, however, mean
> > events like cycles will wild card against all PMUs. A change doing the
> > same was originally posted and merged from:
> > https://lore.kernel.org/r/20240416061533.921723-10-irogers@google.com
> > and reverted by Linus in commit 4f1b067359ac ("Revert "perf
> > parse-events: Prefer sysfs/JSON hardware events over legacy"") due to
> > his dislike for the cycles behavior on ARM with perf record. Earlier
> > patches in this series make perf record event opening failures
> > non-fatal and hide the cycles event's failure to open on ARM in perf
> > record, so it is expected the behavior will now be transparent in perf
> > record on ARM. perf stat with a cycles event will wildcard open the
> > event on all PMUs, however, with default events the cycles event will
> > only be opened on core PMUs.
> >
>
> Hi Ian,
>
> The previous issues seem to be fixed, I don't see any Perf test
> regressions or issues when there is an uncore PMU with a cycles event.
>
> Tested-by: James Clark <james.clark@linaro.org>
Thanks James!
Ian
On Sun, 05 Oct 2025 11:24:03 -0700, Ian Rogers wrote:
> Mirroring similar work for software events in commit 6e9fa4131abb
> ("perf parse-events: Remove non-json software events"). These changes
> migrate the legacy hardware and cache events to json. With no hard
> coded legacy hardware or cache events the wild card, case
> insensitivity, etc. is consistent for events. This does, however, mean
> events like cycles will wild card against all PMUs. A change doing the
> same was originally posted and merged from:
> https://lore.kernel.org/r/20240416061533.921723-10-irogers@google.com
> and reverted by Linus in commit 4f1b067359ac ("Revert "perf
> parse-events: Prefer sysfs/JSON hardware events over legacy"") due to
> his dislike for the cycles behavior on ARM with perf record. Earlier
> patches in this series make perf record event opening failures
> non-fatal and hide the cycles event's failure to open on ARM in perf
> record, so it is expected the behavior will now be transparent in perf
> record on ARM. perf stat with a cycles event will wildcard open the
> event on all PMUs, however, with default events the cycles event will
> only be opened on core PMUs.
>
> [...]
Applied to perf-tools-next, thanks!
Best regards,
Namhyung
On 15/10/2025 4:53 pm, Namhyung Kim wrote:
> On Sun, 05 Oct 2025 11:24:03 -0700, Ian Rogers wrote:
>
>> Mirroring similar work for software events in commit 6e9fa4131abb
>> ("perf parse-events: Remove non-json software events"). These changes
>> migrate the legacy hardware and cache events to json. With no hard
>> coded legacy hardware or cache events the wild card, case
>> insensitivity, etc. is consistent for events. This does, however, mean
>> events like cycles will wild card against all PMUs. A change doing the
>> same was originally posted and merged from:
>> https://lore.kernel.org/r/20240416061533.921723-10-irogers@google.com
>> and reverted by Linus in commit 4f1b067359ac ("Revert "perf
>> parse-events: Prefer sysfs/JSON hardware events over legacy"") due to
>> his dislike for the cycles behavior on ARM with perf record. Earlier
>> patches in this series make perf record event opening failures
>> non-fatal and hide the cycles event's failure to open on ARM in perf
>> record, so it is expected the behavior will now be transparent in perf
>> record on ARM. perf stat with a cycles event will wildcard open the
>> event on all PMUs, however, with default events the cycles event will
>> only be opened on core PMUs.
>>
>> [...]
>
> Applied to perf-tools-next, thanks!
>
> Best regards,
> Namhyung
>
Hi Namhyung,
I'm still getting the build failure that I mentioned on patch 5. This
only seems to happen with out of source builds:
$ make -C tools/perf O=../build/local/ V=1
static const struct pmu_sys_events pmu_sys_event_tables[] = {
{
- .event_table = {
- .pmus = pmu_events__test_soc_sys,
- .num_pmus = ARRAY_SIZE(pmu_events__test_soc_sys)
- },
- .name = "pmu_events__test_soc_sys",
- },
- {
.event_table = { 0, 0 },
.metric_table = { 0, 0 },
},
make[3]: *** [pmu-events/Build:54:
/home/james/workspace/linux/build/local/pmu-events/empty-pmu-events.log]
Error 1
Thanks
James
On Wed, Oct 15, 2025 at 10:39 AM James Clark <james.clark@linaro.org> wrote:
>
>
>
> On 15/10/2025 4:53 pm, Namhyung Kim wrote:
> > On Sun, 05 Oct 2025 11:24:03 -0700, Ian Rogers wrote:
> >
> >> Mirroring similar work for software events in commit 6e9fa4131abb
> >> ("perf parse-events: Remove non-json software events"). These changes
> >> migrate the legacy hardware and cache events to json. With no hard
> >> coded legacy hardware or cache events the wild card, case
> >> insensitivity, etc. is consistent for events. This does, however, mean
> >> events like cycles will wild card against all PMUs. A change doing the
> >> same was originally posted and merged from:
> >> https://lore.kernel.org/r/20240416061533.921723-10-irogers@google.com
> >> and reverted by Linus in commit 4f1b067359ac ("Revert "perf
> >> parse-events: Prefer sysfs/JSON hardware events over legacy"") due to
> >> his dislike for the cycles behavior on ARM with perf record. Earlier
> >> patches in this series make perf record event opening failures
> >> non-fatal and hide the cycles event's failure to open on ARM in perf
> >> record, so it is expected the behavior will now be transparent in perf
> >> record on ARM. perf stat with a cycles event will wildcard open the
> >> event on all PMUs, however, with default events the cycles event will
> >> only be opened on core PMUs.
> >>
> >> [...]
> >
> > Applied to perf-tools-next, thanks!
> >
> > Best regards,
> > Namhyung
> >
>
> Hi Namhyung,
>
> I'm still getting the build failure that I mentioned on patch 5. This
> only seems to happen with out of source builds:
>
> $ make -C tools/perf O=../build/local/ V=1
>
>
> static const struct pmu_sys_events pmu_sys_event_tables[] = {
> {
> - .event_table = {
> - .pmus = pmu_events__test_soc_sys,
> - .num_pmus = ARRAY_SIZE(pmu_events__test_soc_sys)
> - },
> - .name = "pmu_events__test_soc_sys",
> - },
> - {
> .event_table = { 0, 0 },
> .metric_table = { 0, 0 },
> },
> make[3]: *** [pmu-events/Build:54:
> /home/james/workspace/linux/build/local/pmu-events/empty-pmu-events.log]
> Error 1
Sorry for the issue. Is this happening when you don't do a clean
first? I tried recreating your output path, but I can't reproduce the
issue on a clean build. The diff above indicates some issue with the
Makefile processing tools/perf/pmu-events/arch/test/test_soc/. This
directory should be copied to
../build/local/pmu-events/arch/test/test_soc/ and so I wonder if the
copy failed for some reason.
The copy rule is:
https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/pmu-events/Build?h=perf-tools-next#n33
```
# Copy checked-in json for generation.
$(OUTPUT)pmu-events/arch/%: pmu-events/arch/%
$(call rule_mkdir)
$(Q)$(call echo-cmd,gen)cp $< $@
```
The mapping of file names happens in the patsubst in:
https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/pmu-events/Build?h=perf-tools-next#n42
```
GEN_JSON = $(patsubst %,$(OUTPUT)%,$(JSON)) $(LEGACY_CACHE_JSON)
```
Those files are dependencies for the empty-pmu-events.c test so I'm
not sure how this can be failing for you.
Thanks,
Ian
On 15/10/2025 10:24 pm, Ian Rogers wrote:
> On Wed, Oct 15, 2025 at 10:39 AM James Clark <james.clark@linaro.org> wrote:
>>
>>
>>
>> On 15/10/2025 4:53 pm, Namhyung Kim wrote:
>>> On Sun, 05 Oct 2025 11:24:03 -0700, Ian Rogers wrote:
>>>
>>>> Mirroring similar work for software events in commit 6e9fa4131abb
>>>> ("perf parse-events: Remove non-json software events"). These changes
>>>> migrate the legacy hardware and cache events to json. With no hard
>>>> coded legacy hardware or cache events the wild card, case
>>>> insensitivity, etc. is consistent for events. This does, however, mean
>>>> events like cycles will wild card against all PMUs. A change doing the
>>>> same was originally posted and merged from:
>>>> https://lore.kernel.org/r/20240416061533.921723-10-irogers@google.com
>>>> and reverted by Linus in commit 4f1b067359ac ("Revert "perf
>>>> parse-events: Prefer sysfs/JSON hardware events over legacy"") due to
>>>> his dislike for the cycles behavior on ARM with perf record. Earlier
>>>> patches in this series make perf record event opening failures
>>>> non-fatal and hide the cycles event's failure to open on ARM in perf
>>>> record, so it is expected the behavior will now be transparent in perf
>>>> record on ARM. perf stat with a cycles event will wildcard open the
>>>> event on all PMUs, however, with default events the cycles event will
>>>> only be opened on core PMUs.
>>>>
>>>> [...]
>>>
>>> Applied to perf-tools-next, thanks!
>>>
>>> Best regards,
>>> Namhyung
>>>
>>
>> Hi Namhyung,
>>
>> I'm still getting the build failure that I mentioned on patch 5. This
>> only seems to happen with out of source builds:
>>
>> $ make -C tools/perf O=../build/local/ V=1
>>
>>
>> static const struct pmu_sys_events pmu_sys_event_tables[] = {
>> {
>> - .event_table = {
>> - .pmus = pmu_events__test_soc_sys,
>> - .num_pmus = ARRAY_SIZE(pmu_events__test_soc_sys)
>> - },
>> - .name = "pmu_events__test_soc_sys",
>> - },
>> - {
>> .event_table = { 0, 0 },
>> .metric_table = { 0, 0 },
>> },
>> make[3]: *** [pmu-events/Build:54:
>> /home/james/workspace/linux/build/local/pmu-events/empty-pmu-events.log]
>> Error 1
>
> Sorry for the issue. Is this happening when you don't do a clean
> first? I tried recreating your output path, but I can't reproduce the
> issue on a clean build. The diff above indicates some issue with the
The clean issue was separate to the build failure. I meant that the
build failure was sticky when I was bisecting. So after commit 5 the
build breaks on a clean build but then it stayed broken even on builds
before commit 5 unless I cleaned. I think we can ignore this for now.
> Makefile processing tools/perf/pmu-events/arch/test/test_soc/. This
> directory should be copied to
> ../build/local/pmu-events/arch/test/test_soc/ and so I wonder if the
> copy failed for some reason.
>
> The copy rule is:
> https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/pmu-events/Build?h=perf-tools-next#n33
> ```
> # Copy checked-in json for generation.
> $(OUTPUT)pmu-events/arch/%: pmu-events/arch/%
> $(call rule_mkdir)
> $(Q)$(call echo-cmd,gen)cp $< $@
> ```
>
> The mapping of file names happens in the patsubst in:
> https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-next.git/tree/tools/perf/pmu-events/Build?h=perf-tools-next#n42
> ```
> GEN_JSON = $(patsubst %,$(OUTPUT)%,$(JSON)) $(LEGACY_CACHE_JSON)
> ```
>
> Those files are dependencies for the empty-pmu-events.c test so I'm
> not sure how this can be failing for you.
>
> Thanks,
> Ian
If I apply this patchset to commit 2a67955de136 ("perf bpf_counter: Fix
opening of "any"(-1) CPU events"), then:
$ rm -r ../build/local ; mkdir ../build/local
$ git clean -xfd
$ make -C tools/perf O=../build/local/ -j1 V=1
I get no copy of the test jsons:
$ ls ../build/local/pmu-events/arch/test/test_soc/
ls: cannot access '../build/local/pmu-events/arch/test/test_soc/': No
such file or directory
Looking at the dependencies of the rule for $(PMU_EVENTS_C), it's
$(JSON_TEST), but JSON_TEST is the in-source version without the
$(OUTPUT) prefix. That's already satisfied so it skips the copy.
If I modify the generator for JSON_TEST to include the OUTPUT prefix:
JSON_TEST = $(shell [ -d $(JDIR_TEST) ] & \
find $(JDIR_TEST) -name '*.json' | sed -e 's|^|$(OUTPUT)|g')
Now I get the copy:
$ ls ../build/local/pmu-events/arch/test/test_soc/
total 0
drwxrwxr-x 1 james 56 Oct 16 11:13 ..
drwxrwxr-x 1 james 108 Oct 16 11:13 cpu
drwxrwxr-x 1 james 12 Oct 16 11:13 .
drwxrwxr-x 1 james 22 Oct 16 11:13 sys
Now the diff check is slightly different/better, but the build still
fails. Weirdly I don't see this failure on my Arm machine which is where
I tested the whole set, I only see this failure on x86. Maybe some
difference in the version of make?
On 16/10/2025 11:29 am, James Clark wrote:
>
>
> On 15/10/2025 10:24 pm, Ian Rogers wrote:
>> On Wed, Oct 15, 2025 at 10:39 AM James Clark <james.clark@linaro.org>
>> wrote:
>>>
>>>
>>>
>>> On 15/10/2025 4:53 pm, Namhyung Kim wrote:
>>>> On Sun, 05 Oct 2025 11:24:03 -0700, Ian Rogers wrote:
>>>>
>>>>> Mirroring similar work for software events in commit 6e9fa4131abb
>>>>> ("perf parse-events: Remove non-json software events"). These changes
>>>>> migrate the legacy hardware and cache events to json. With no hard
>>>>> coded legacy hardware or cache events the wild card, case
>>>>> insensitivity, etc. is consistent for events. This does, however, mean
>>>>> events like cycles will wild card against all PMUs. A change doing the
>>>>> same was originally posted and merged from:
>>>>> https://lore.kernel.org/r/20240416061533.921723-10-irogers@google.com
>>>>> and reverted by Linus in commit 4f1b067359ac ("Revert "perf
>>>>> parse-events: Prefer sysfs/JSON hardware events over legacy"") due to
>>>>> his dislike for the cycles behavior on ARM with perf record. Earlier
>>>>> patches in this series make perf record event opening failures
>>>>> non-fatal and hide the cycles event's failure to open on ARM in perf
>>>>> record, so it is expected the behavior will now be transparent in perf
>>>>> record on ARM. perf stat with a cycles event will wildcard open the
>>>>> event on all PMUs, however, with default events the cycles event will
>>>>> only be opened on core PMUs.
>>>>>
>>>>> [...]
>>>>
>>>> Applied to perf-tools-next, thanks!
>>>>
>>>> Best regards,
>>>> Namhyung
>>>>
>>>
>>> Hi Namhyung,
>>>
>>> I'm still getting the build failure that I mentioned on patch 5. This
>>> only seems to happen with out of source builds:
>>>
>>> $ make -C tools/perf O=../build/local/ V=1
>>>
>>>
>>> static const struct pmu_sys_events pmu_sys_event_tables[] = {
>>> {
>>> - .event_table = {
>>> - .pmus = pmu_events__test_soc_sys,
>>> - .num_pmus = ARRAY_SIZE(pmu_events__test_soc_sys)
>>> - },
>>> - .name = "pmu_events__test_soc_sys",
>>> - },
>>> - {
>>> .event_table = { 0, 0 },
>>> .metric_table = { 0, 0 },
>>> },
>>> make[3]: *** [pmu-events/Build:54:
>>> /home/james/workspace/linux/build/local/pmu-events/empty-pmu-events.log]
>>> Error 1
>>
>> Sorry for the issue. Is this happening when you don't do a clean
>> first? I tried recreating your output path, but I can't reproduce the
>> issue on a clean build. The diff above indicates some issue with the
>
> The clean issue was separate to the build failure. I meant that the
> build failure was sticky when I was bisecting. So after commit 5 the
> build breaks on a clean build but then it stayed broken even on builds
> before commit 5 unless I cleaned. I think we can ignore this for now.
>
>> Makefile processing tools/perf/pmu-events/arch/test/test_soc/. This
>> directory should be copied to
>> ../build/local/pmu-events/arch/test/test_soc/ and so I wonder if the
>> copy failed for some reason.
>>
>> The copy rule is:
>> https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-
>> next.git/tree/tools/perf/pmu-events/Build?h=perf-tools-next#n33
>> ```
>> # Copy checked-in json for generation.
>> $(OUTPUT)pmu-events/arch/%: pmu-events/arch/%
>> $(call rule_mkdir)
>> $(Q)$(call echo-cmd,gen)cp $< $@
>> ```
>>
>> The mapping of file names happens in the patsubst in:
>> https://web.git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools-
>> next.git/tree/tools/perf/pmu-events/Build?h=perf-tools-next#n42
>> ```
>> GEN_JSON = $(patsubst %,$(OUTPUT)%,$(JSON)) $(LEGACY_CACHE_JSON)
>> ```
>>
>> Those files are dependencies for the empty-pmu-events.c test so I'm
>> not sure how this can be failing for you.
>>
>> Thanks,
>> Ian
>
> If I apply this patchset to commit 2a67955de136 ("perf bpf_counter: Fix
> opening of "any"(-1) CPU events"), then:
>
> $ rm -r ../build/local ; mkdir ../build/local
> $ git clean -xfd
> $ make -C tools/perf O=../build/local/ -j1 V=1
>
> I get no copy of the test jsons:
>
> $ ls ../build/local/pmu-events/arch/test/test_soc/
>
> ls: cannot access '../build/local/pmu-events/arch/test/test_soc/': No
> such file or directory
>
> Looking at the dependencies of the rule for $(PMU_EVENTS_C), it's
> $(JSON_TEST), but JSON_TEST is the in-source version without the
> $(OUTPUT) prefix. That's already satisfied so it skips the copy.
>
> If I modify the generator for JSON_TEST to include the OUTPUT prefix:
>
> JSON_TEST = $(shell [ -d $(JDIR_TEST) ] & \
> find $(JDIR_TEST) -name '*.json' | sed -e 's|^|$(OUTPUT)|g')
>
> Now I get the copy:
>
> $ ls ../build/local/pmu-events/arch/test/test_soc/
>
> total 0
> drwxrwxr-x 1 james 56 Oct 16 11:13 ..
> drwxrwxr-x 1 james 108 Oct 16 11:13 cpu
> drwxrwxr-x 1 james 12 Oct 16 11:13 .
> drwxrwxr-x 1 james 22 Oct 16 11:13 sys
>
> Now the diff check is slightly different/better, but the build still
> fails. Weirdly I don't see this failure on my Arm machine which is where
> I tested the whole set, I only see this failure on x86. Maybe some
> difference in the version of make?
>
Turned out to be an extra json file I had in the Perf tree for my
compilation database, so that explains why I was the only person seeing
it. Sent a fix.
© 2016 - 2025 Red Hat, Inc.