[PATCH v1] perf build: Reduce pmu-events related copying and mkdirs

Ian Rogers posted 1 patch 4 days, 6 hours ago
There is a newer version of this series
tools/perf/pmu-events/Build | 212 ++++++++++++++++++++++++------------
1 file changed, 144 insertions(+), 68 deletions(-)
[PATCH v1] perf build: Reduce pmu-events related copying and mkdirs
Posted by Ian Rogers 4 days, 6 hours ago
When building to an output directory the previous code would remove
files and then copy the source files over. Each source file copy would
have a rule to make its directory. All json for every architecture was
considered a source file. This led to unnecessary copying as a file
would be deleted and then the same file copied again, unnecessary
directory making, and copying of files not used in the build. A
side-effect would be a lot of build messages.

This change makes it so that all computed output files are created and
then compared to all files in the OUTPUT directory. By filtering out
the files that would be copied, unnecessary files can be determined
and then deleted - note, this is a phony target which would remake the
pmu-events.c if always depended upon, and so the dependency is
conditional on there being files to remove. This has some overhead as
the $(OUTPUT)/pmu-events is "find" over rather than just "rm -fr", but
the savings from unnecessary copying, etc. should make up for this new
make overhead. The copy target just does copying but has a dependency
on the directory it needs being built, avoiding repetitive mkdirs. The
source files for copying only consider the JEVENTS_ARCH unless the
JEVENTS_ARCH is all. The metric json is only generated if appropriate,
rather than always being generated and jevents.py deciding whether or
not to use the files. The mypy and pylint targets are fixed as
variable names had changed but the rules not updated.

The line count of a build with "make -C tools/perf O=/tmp/perf clean all"
prior to this change was 2181 lines, after this change it is 1596
lines. This is a reduction of 585 lines or about 27%.

The generated pmu-events.c for JEVENTS_ARCH "x86" and "all" were
validated as being identical after this change.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/pmu-events/Build | 212 ++++++++++++++++++++++++------------
 1 file changed, 144 insertions(+), 68 deletions(-)

diff --git a/tools/perf/pmu-events/Build b/tools/perf/pmu-events/Build
index ec964ed05974..153ca26c0b74 100644
--- a/tools/perf/pmu-events/Build
+++ b/tools/perf/pmu-events/Build
@@ -1,63 +1,61 @@
-pmu-events-y	+= pmu-events.o
-JSON		=  $(shell find pmu-events/arch -name '*.json' -o -name '*.csv')
-JSON_DIRS	=  $(shell find pmu-events/arch -type d)
-JDIR_TEST	=  pmu-events/arch/test
-JSON_TEST	=  $(shell [ -d $(JDIR_TEST) ] &&			\
-			find $(JDIR_TEST) -name '*.json')
-JEVENTS_PY	=  pmu-events/jevents.py
-METRIC_PY	=  pmu-events/metric.py
-METRIC_TEST_PY	=  pmu-events/metric_test.py
 EMPTY_PMU_EVENTS_C = pmu-events/empty-pmu-events.c
+# pmu-events.c will be generated by jevents.py or copied from EMPTY_PMU_EVENTS_C
 PMU_EVENTS_C	=  $(OUTPUT)pmu-events/pmu-events.c
-METRIC_TEST_LOG	=  $(OUTPUT)pmu-events/metric_test.log
-TEST_EMPTY_PMU_EVENTS_C = $(OUTPUT)pmu-events/test-empty-pmu-events.c
-EMPTY_PMU_EVENTS_TEST_LOG = $(OUTPUT)pmu-events/empty-pmu-events.log
-LEGACY_CACHE_PY	=  pmu-events/make_legacy_cache.py
-LEGACY_CACHE_JSON = $(OUTPUT)pmu-events/arch/common/common/legacy-cache.json
+pmu-events-y	+= pmu-events.o
 
-ifeq ($(JEVENTS_ARCH),)
-JEVENTS_ARCH=$(SRCARCH)
-endif
-JEVENTS_MODEL ?= all
+# pmu-events.c file is generated in the OUTPUT directory so it needs a
+# separate rule to depend on it properly
+$(OUTPUT)pmu-events/pmu-events.o: $(PMU_EVENTS_C)
+	$(call rule_mkdir)
+	$(call if_changed_dep,cc_o_c)
 
-#
-# Locate/process JSON files in pmu-events/arch/
-# directory and create tables in pmu-events.c.
-#
+# Message for $(call echo-cmd,cp), possibly remove the src file from
+# the destination to save space in the build log.
+quiet_cmd_cp   = COPY    $(patsubst %$<,%,$@) <- $<
 
+# --- NO_JEVENTS=1 build ---
 ifeq ($(NO_JEVENTS),1)
 $(PMU_EVENTS_C): $(EMPTY_PMU_EVENTS_C)
 	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,gen)cp $< $@
+	$(Q)$(call echo-cmd,cp)cp $< $@
 else
-# Functions to extract the model from a extra-metrics.json or extra-metricgroups.json path.
-model_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/extra-metric.*\.json@\1@')
-vendor_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/[^/]*/extra-metric.*\.json@\1@')
+# --- Regular build ---
 
-# Copy checked-in json to OUTPUT for generation if it's an out of source build
-ifneq ($(OUTPUT),)
-# Remove all output directories when any source directory timestamp changes
-# so there are no stale deleted files
-JSON_DIRS_ROOT = $(OUTPUT)pmu-events/arch/
-$(JSON_DIRS_ROOT): $(JSON_DIRS)
-	$(Q)$(call echo-cmd,gen)rm -rf $@
-	$(Q)mkdir -p $@
+# Setup the JEVENTS_ARCH and JEVENTS_MODEL
+ifeq ($(JEVENTS_ARCH),)
+JEVENTS_ARCH=$(SRCARCH)
+endif
+JEVENTS_MODEL ?= all
 
-$(OUTPUT)pmu-events/arch/%: pmu-events/arch/% $(JSON_DIRS_ROOT)
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,gen)cp $< $@
+# The input json/csv files
+SRC_DIR		:= pmu-events/arch
+ifeq ($(JEVENTS_ARCH),all)
+SRC_JSON	:= $(shell find $(SRC_DIR) -name '*.json' -o -name '*.csv')
+else
+SRC_JSON	:= $(shell find $(SRC_DIR)/common $(SRC_DIR)/test $(SRC_DIR)/$(JEVENTS_ARCH) -name '*.json' -o -name '*.csv')
 endif
 
-$(LEGACY_CACHE_JSON): $(LEGACY_CACHE_PY) $(JSON_DIRS_ROOT)
+# Python to build the generic legacy cache events
+LEGACY_CACHE_PY	=  pmu-events/make_legacy_cache.py
+LEGACY_CACHE_JSON = $(OUTPUT)pmu-events/arch/common/common/legacy-cache.json
+GEN_JSON = $(LEGACY_CACHE_JSON)
+
+$(LEGACY_CACHE_JSON): $(LEGACY_CACHE_PY)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $(LEGACY_CACHE_PY) > $@
 
+# Python to generate architectural metrics
 GEN_METRIC_DEPS := pmu-events/metric.py pmu-events/common_metrics.py
+# Functions to extract the model from an extra-metrics.json or extra-metricgroups.json path.
+model_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/extra-metric.*\.json@\1@')
+vendor_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/[^/]*/extra-metric.*\.json@\1@')
 
+ifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),x86 all))
 # Generate AMD Json
 ZENS = $(shell ls -d pmu-events/arch/x86/amdzen*)
 ZEN_METRICS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metrics.json)
 ZEN_METRICGROUPS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metricgroups.json)
+GEN_JSON += $(ZEN_METRICS) $(ZEN_METRICGROUPS)
 
 $(ZEN_METRICS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
@@ -67,10 +65,14 @@ $(ZEN_METRICGROUPS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@
 
+endif
+
+ifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),arm64 all))
 # Generate ARM Json
 ARMS = $(shell ls -d pmu-events/arch/arm64/arm/*|grep -v cmn)
 ARM_METRICS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metrics.json)
 ARM_METRICGROUPS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metricgroups.json)
+GEN_JSON += $(ARM_METRICS) $(ARM_METRICGROUPS)
 
 $(ARM_METRICS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
@@ -80,10 +82,14 @@ $(ARM_METRICGROUPS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call vendor_name,$@) $(call model_name,$@) pmu-events/arch > $@
 
+endif
+
+ifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),x86 all))
 # Generate Intel Json
 INTELS = $(shell ls -d pmu-events/arch/x86/*|grep -v amdzen|grep -v mapfile.csv)
 INTEL_METRICS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metrics.json)
 INTEL_METRICGROUPS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metricgroups.json)
+GEN_JSON += $(INTEL_METRICS) $(INTEL_METRICGROUPS)
 
 $(INTEL_METRICS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
@@ -93,18 +99,64 @@ $(INTEL_METRICGROUPS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@
 
-GEN_JSON = $(patsubst %,$(OUTPUT)%,$(JSON)) \
-            $(LEGACY_CACHE_JSON) \
-            $(JSON_DIRS) \
-            $(ZEN_METRICS) $(ZEN_METRICGROUPS) \
-            $(ARM_METRICS) $(ARM_METRICGROUPS) \
-            $(INTEL_METRICS) $(INTEL_METRICGROUPS)
+endif
+
+OUT_DIR		:= $(OUTPUT)pmu-events/arch
+
+ifeq ($(OUTPUT),)
+OUT_JSON	:= $(SRC_JSON)
+ORPHAN_FILES	:=
+else
+# Things that need to be built in the OUTPUT directory. Note, ensure
+# there is a slash after the directory name so that it matches what
+# $(dir) gives in COPY_RULE.
+OUT_JSON	:= $(patsubst $(SRC_DIR)/%,$(OUT_DIR)/%,$(SRC_JSON))
+OUT_DIRS	:= $(sort $(patsubst %/,%,$(dir $(OUT_JSON))))
+
+# Things already in the OUTPUT directory
+CUR_OUT_JSON	:= $(shell [ -d $(OUT_DIR) ] && find $(OUT_DIR) -type f)
+
+# Things in the OUTPUT directory but shouldn't be there as computed by
+# OUT_JSON and GEN_JSON.
+ORPHAN_FILES	:= $(filter-out $(OUT_JSON) $(GEN_JSON),$(CUR_OUT_JSON))
+
+# Message for $(call echo-cmd,mkd). There is already a mkdir message
+# but it assumes $@ is a file to mkdir the directory for.
+quiet_cmd_mkd  = MKDIR   $@
+
+$(OUT_DIRS):
+	$(Q)$(call echo-cmd,mkd)mkdir -p $@
+
+# Explicitly generate rules to copy SRC_JSON files as $(dir) cannot
+# apply to $@ in a dependency.
+define COPY_RULE
+$(2): $(1) | $(3)
+	$$(Q)$$(call echo-cmd,cp)cp $(1) $(2)
+endef
+$(foreach src,$(SRC_JSON), \
+    $(eval dest := $(patsubst $(SRC_DIR)/%,$(OUT_DIR)/%,$(src))) \
+    $(eval ddir := $(patsubst %/,%,$(dir $(dest)))) \
+    $(eval $(call COPY_RULE,$(src),$(dest),$(ddir))) \
+)
+
+endif # ifneq ($(OUTPUT),)
+
+JEVENTS_PY	=  pmu-events/jevents.py
+METRIC_PY	=  pmu-events/metric.py
+
+# Rule to run the metric test.
+METRIC_TEST_PY	=  pmu-events/metric_test.py
+METRIC_TEST_LOG	=  $(OUTPUT)pmu-events/metric_test.log
 
 $(METRIC_TEST_LOG): $(METRIC_TEST_PY) $(METRIC_PY)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,test)$(PYTHON) $< 2> $@ || (cat $@ && false)
 
-$(TEST_EMPTY_PMU_EVENTS_C): $(GEN_JSON) $(JSON_TEST) $(JEVENTS_PY) $(METRIC_PY) $(METRIC_TEST_LOG)
+# Rule to create then ensure the empty-pmu-events.c is in sync.
+TEST_EMPTY_PMU_EVENTS_C = $(OUTPUT)pmu-events/test-empty-pmu-events.c
+EMPTY_PMU_EVENTS_TEST_LOG = $(OUTPUT)pmu-events/empty-pmu-events.log
+
+$(TEST_EMPTY_PMU_EVENTS_C): $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) none none $(OUTPUT)pmu-events/arch $@
 
@@ -112,36 +164,60 @@ $(EMPTY_PMU_EVENTS_TEST_LOG): $(EMPTY_PMU_EVENTS_C) $(TEST_EMPTY_PMU_EVENTS_C)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,test)diff -u $^ 2> $@ || (cat $@ && false)
 
+
+# Dependencies for jevents.py
+JEVENTS_DEPS := $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY) $(EMPTY_PMU_EVENTS_TEST_LOG) $(METRIC_TEST_LOG)
+
+# Rules to run mypy if enabled.
 ifdef MYPY
-  PMU_EVENTS_PY_TESTS := $(wildcard *.py)
-  PMU_EVENTS_MYPY_TEST_LOGS := $(JEVENTS_PY_TESTS:%=%.mypy_log)
-else
-  PMU_EVENTS_MYPY_TEST_LOGS :=
+define MYPY_RULE
+$(2): $(1)
+	$$(Q)$$(call echo-cmd,test)mypy $(1) > $(2) || (cat $(2) && rm $(2) && false)
+endef
+$(foreach src,$(wildcard pmu-events/*.py), \
+    $(eval dest := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.mypy_log,$(src))) \
+    $(eval $(call MYPY_RULE,$(src),$(dest))) \
+)
+
+MYPY_INPUTS := $(wildcard pmu-events/*.py)
+MYPY_OUTPUTS := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.mypy_log,$(MYPY_INPUTS))
+JEVENTS_DEPS += $(MYPY_OUTPUTS)
 endif
 
-$(OUTPUT)%.mypy_log: %
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,test)mypy "$<" > $@ || (cat $@ && rm $@ && false)
-
+# Rules to run pylint if enabled.
 ifdef PYLINT
-  PMU_EVENTS_PY_TESTS := $(wildcard *.py)
-  PMU_EVENTS_PYLINT_TEST_LOGS := $(JEVENTS_PY_TESTS:%=%.pylint_log)
-else
-  PMU_EVENTS_PYLINT_TEST_LOGS :=
+define PYLINT_RULE
+$(2): $(1)
+	$$(Q)$$(call echo-cmd,test)pylint $(1) > $(2) || (cat $(2) && rm $(2) && false)
+endef
+$(foreach src,$(wildcard pmu-events/*.py), \
+    $(eval dest := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.pylint_log,$(src))) \
+    $(eval $(call PYLINT_RULE,$(src),$(dest))) \
+)
+
+PYLINT_INPUTS := $(wildcard pmu-events/*.py)
+PYLINT_OUTPUTS := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.pylint_log,$(PYLINT_INPUTS))
+JEVENTS_DEPS += $(PYLINT_OUTPUTS)
 endif
 
-$(OUTPUT)%.pylint_log: %
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,test)pylint "$<" > $@ || (cat $@ && rm $@ && false)
+# If there are orphaned files remove them.
+ifneq ($(strip $(ORPHAN_FILES)),)
+.PHONY: prune_orphans
 
-$(PMU_EVENTS_C): $(GEN_JSON) $(JSON_TEST) $(JEVENTS_PY) $(METRIC_PY) $(METRIC_TEST_LOG) \
-    $(EMPTY_PMU_EVENTS_TEST_LOG) $(PMU_EVENTS_MYPY_TEST_LOGS) $(PMU_EVENTS_PYLINT_TEST_LOGS)
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) $(JEVENTS_ARCH) $(JEVENTS_MODEL) $(OUTPUT)pmu-events/arch $@
+# Message for $(call echo-cmd,rm). Generally cleaning files isn't part
+# of a build step.
+quiet_cmd_rm  = RM      $^
+
+prune_orphans: $(ORPHAN_FILES)
+	$(Q)$(call echo-cmd,rm)rm -f $^
+
+JEVENTS_DEPS += prune_orphans
 endif
 
-# pmu-events.c file is generated in the OUTPUT directory so it needs a
-# separate rule to depend on it properly
-$(OUTPUT)pmu-events/pmu-events.o: $(PMU_EVENTS_C)
+# Finally, the rule to build pmu-events.c using jevents.py. All test
+# and inputs are dependencies.
+$(PMU_EVENTS_C): $(JEVENTS_DEPS)
 	$(call rule_mkdir)
-	$(call if_changed_dep,cc_o_c)
+	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) $(JEVENTS_ARCH) $(JEVENTS_MODEL) $(OUT_DIR) $@
+
+endif # ifeq ($(NO_JEVENTS),1)
-- 
2.53.0.rc1.225.gd81095ad13-goog
Re: [PATCH v1] perf build: Reduce pmu-events related copying and mkdirs
Posted by Ian Rogers 4 days, 5 hours ago
On Mon, Feb 2, 2026 at 9:13 PM Ian Rogers <irogers@google.com> wrote:
>
> When building to an output directory the previous code would remove
> files and then copy the source files over. Each source file copy would
> have a rule to make its directory. All json for every architecture was
> considered a source file. This led to unnecessary copying as a file
> would be deleted and then the same file copied again, unnecessary
> directory making, and copying of files not used in the build. A
> side-effect would be a lot of build messages.
>
> This change makes it so that all computed output files are created and
> then compared to all files in the OUTPUT directory. By filtering out
> the files that would be copied, unnecessary files can be determined
> and then deleted - note, this is a phony target which would remake the
> pmu-events.c if always depended upon, and so the dependency is
> conditional on there being files to remove. This has some overhead as
> the $(OUTPUT)/pmu-events is "find" over rather than just "rm -fr", but
> the savings from unnecessary copying, etc. should make up for this new
> make overhead. The copy target just does copying but has a dependency
> on the directory it needs being built, avoiding repetitive mkdirs. The
> source files for copying only consider the JEVENTS_ARCH unless the
> JEVENTS_ARCH is all. The metric json is only generated if appropriate,
> rather than always being generated and jevents.py deciding whether or
> not to use the files. The mypy and pylint targets are fixed as
> variable names had changed but the rules not updated.
>
> The line count of a build with "make -C tools/perf O=/tmp/perf clean all"
> prior to this change was 2181 lines, after this change it is 1596
> lines. This is a reduction of 585 lines or about 27%.
>
> The generated pmu-events.c for JEVENTS_ARCH "x86" and "all" were
> validated as being identical after this change.
>
> Signed-off-by: Ian Rogers <irogers@google.com>

I just wanted to add a note on testing this change. You can see the
rules run by say building JEVENTS_ARCH=arm64 and then switching to
JEVENTS_ARCH=x86. The first build will copy the arm64 json to the
OUTPUT directory, the second will find the arm64 json shouldn't be in
the OUTPUT directory and remove it while copying/generating in all the
x86 json.

```
$ make -C tools/perf O=/tmp/perf3 JEVENTS_ARCH=arm64 clean all
...
 MKDIR   /tmp/perf3/pmu-events/arch/common/common
 MKDIR   /tmp/perf3/pmu-events/arch/test/test_soc/sys
 MKDIR   /tmp/perf3/pmu-events/arch/test/test_soc/cpu
 COPY    /tmp/perf3/ <- pmu-events/arch/test/arch-std-events.json
 MKDIR   /tmp/perf3/pmu-events/arch/arm64
 MKDIR   /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08
 MKDIR   /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip09/sys
 MKDIR   /tmp/perf3/pmu-events/arch/arm64/cavium/thunderx2
 COPY    /tmp/perf3/ <- pmu-events/arch/arm64/recommended.json
 MKDIR   /tmp/perf3/pmu-events/arch/arm64/thead/yitian710/sys
 MKDIR   /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone
 MKDIR   /tmp/perf3/pmu-events/arch/arm64/ampere/emag
 MKDIR   /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex
...
 GEN     /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/extra-metrics.json
 GEN     /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/extra-metrics.json
 GEN     /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/extra-metrics.json
 COPY    /tmp/perf3/ <- pmu-events/arch/common/common/legacy-hardware.json
 COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/sys/uncore.json
 COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/metrics.json
 COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/uncore.json
 COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/other.json
 COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/cache.json
 COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/branch.json
 COPY    /tmp/perf3/ <- pmu-events/arch/arm64/mapfile.csv
 COPY    /tmp/perf3/ <- pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json
 COPY    /tmp/perf3/ <- pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json
 ...
 TEST    /tmp/perf3/pmu-events/empty-pmu-events.log
 GEN     /tmp/perf3/pmu-events/pmu-events.c
...
$ make -C tools/perf O=/tmp/perf3 JEVENTS_ARCH=x86 all
 MKDIR   /tmp/perf3/pmu-events/arch/x86
 MKDIR   /tmp/perf3/pmu-events/arch/x86/elkhartlake
 MKDIR   /tmp/perf3/pmu-events/arch/x86/rocketlake
 MKDIR   /tmp/perf3/pmu-events/arch/x86/broadwellde
...
 GEN     /tmp/perf3/pmu-events/arch/x86/amdzen1/extra-metrics.json
 GEN     /tmp/perf3/pmu-events/arch/x86/amdzen2/extra-metrics.json
 GEN     /tmp/perf3/pmu-events/arch/x86/amdzen3/extra-metrics.json
 GEN     /tmp/perf3/pmu-events/arch/x86/amdzen4/extra-metrics.json
 GEN     /tmp/perf3/pmu-events/arch/x86/amdzen5/extra-metrics.json
 GEN     /tmp/perf3/pmu-events/arch/x86/amdzen6/extra-metrics.json
 GEN     /tmp/perf3/pmu-events/arch/x86/amdzen1/extra-metricgroups.json
 GEN     /tmp/perf3/pmu-events/arch/x86/amdzen2/extra-metricgroups.json
...
 COPY    /tmp/perf3/ <- pmu-events/arch/x86/mapfile.csv
 COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/ehl-metrics.json
 RM      /tmp/perf3/pmu-events/arch/arm64/mapfile.csv
/tmp/perf3/pmu-events/arch/arm64/sbsa.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx8mq/sys/ddrc.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx8mq/sys/metrics.json
/tmp/per
f3/pmu-events/arch/arm64/freescale/imx8mp/sys/ddrc.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx8mp/sys/metrics.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx93/sys/ddrc.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx93/sy
s/metrics.json /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mm/sys/ddrc.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx8mm/sys/metrics.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx8mn/sys/ddrc.json
/tmp/perf3/pmu-events/arch/
arm64/freescale/imx8mn/sys/metrics.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx94/sys/ddrc.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx94/sys/metrics.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx91/sys/ddrc.json /tmp/
perf3/pmu-events/arch/arm64/freescale/imx91/sys/metrics.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx95/sys/ddrc.json
/tmp/perf3/pmu-events/arch/arm64/freescale/imx95/sys/metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53
/branch.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/other.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-
a53/bus.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/extra-metrics.json
/tmp/perf3/pmu-events/arc
h/arm64/arm/cortex-a73/etm.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/instruction.json
/tmp/perf3/pmu-events
/arch/arm64/arm/cortex-a73/mmu.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/memory.json
/tmp/perf3/pmu-events/
arch/arm64/arm/cortex-a73/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/ll_cache
.json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/spec_operation.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/l3_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/stall.json
/tmp/perf3/pmu-events/arch/arm64/arm/ne
overse-v1/tlb.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/general.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/retired.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/metrics.json
/tmp/perf3/pmu-events/arch/arm64
/arm/neoverse-v1/spe.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/l1i_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/fp_operation.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/bus.json
/tmp/perf3/pmu-events/
arch/arm64/arm/neoverse-v1/l1d_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/sve.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/exception.json
/tmp/perf3/p
mu-events/arch/arm64/arm/neoverse-v1/l2_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a
75/etm.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cort
ex-a75/mmu.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/corte
x-a75/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/branch.json
/tmp/perf3/pmu
-events/arch/arm64/arm/cortex-a65-e1/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/ifu.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/pipeline.j
son /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-
a65-e1/dpu.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
/tmp/perf3/pmu-events/
arch/arm64/arm/cmn/sys/metric.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/pipeline.json
/tmp/perf3/p
mu-events/arch/arm64/arm/cortex-a510/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/trace.json /tmp/perf3
/pmu-events/arch/arm64/arm/cortex-a510/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/neove
rse-v3/ll_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/spec_operation.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/stall.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/general.json
/tmp/perf3/pmu-events/arc
h/arm64/arm/neoverse-v3/tlb.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/retired.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/brbe.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/metrics.json
/tmp/perf3/pmu-events
/arch/arm64/arm/neoverse-v3/spe.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/l1i_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/fp_operation.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/bus.json /tmp/perf3/
pmu-events/arch/arm64/arm/neoverse-v3/l1d_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/sve.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/exception.json /
tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/l2_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/a
rm/cortex-a77/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/pipeline.json
/tmp/perf3/pmu-events/arc
h/arm64/arm/cortex-a77/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/extra-metricgroups.json
/tmp/perf3
/pmu-events/arch/arm64/arm/cortex-a77/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57
-a72/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/exception.json
/tmp/perf3/pmu-events/arch/ar
m64/arm/cortex-a57-a72/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/ll_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/spec_op
eration.json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/l3_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/stall.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/tlb.json
/tmp/perf3/pmu-events/arch/arm64/arm/neover
se-n1/general.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/retired.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/spe.json
/tmp/perf3/pmu-events/arch/arm64/arm
/neoverse-n1/l1i_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/l1d_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/memory.json
/tmp/perf3/pmu-events/arch
/arm64/arm/neoverse-n1/l2_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/extra-metrics.
json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/ll_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l3_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/spec_operation.json
/tmp/perf3/pmu-events/arch/arm64/arm/
neoverse-n3/stall.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/tlb.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/general.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/retired.json
/tmp/perf3/pmu-events/arch/arm64
/arm/neoverse-n3/metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/spe.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l1i_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/fp_operation.json
/tmp/perf3/pmu-eve
nts/arch/arm64/arm/neoverse-n3/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l1d_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/sve.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/trace.json
/tmp/perf3/pmu-
events/arch/arm64/arm/neoverse-n3/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l2_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/extra-metricgro
ups.json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/
cortex-x1/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cor
tex-x1/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/branch.json
/tmp/perf3/pmu-even
ts/arch/arm64/arm/cortex-x2/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/bus.json
/tmp/perf3/pmu-ev
ents/arch/arm64/arm/cortex-x2/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/trace.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/extra-metricgroups.json
/tmp
/perf3/pmu-events/arch/arm64/arm/cortex-x2/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/ca
che.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/
extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/instruction.json
/tmp/perf3/pmu-events
/arch/arm64/arm/cortex-a55/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/bus.json
/tmp/perf3/pmu-event
s/arch/arm64/arm/cortex-a55/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/spe
c_operation.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/ll_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l3_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/stall.json
/tmp/perf3/pmu-events/arc
h/arm64/arm/neoverse-n2-v2/tlb.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/general.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/retired.json
/tmp/p
erf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/spe.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l1i_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/fp_operation.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse
-n2-v2/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l1d_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/sve.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/trace.json
/tmp/perf3/pmu-events/arch/arm
64/arm/neoverse-n2-v2/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l2_cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/extra-metricgroups
.json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/branch.json
/tmp/perf3/pmu-events/arch/arm64/ar
m/cortex-a35/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/exception.json
/tmp/perf3/pmu-events/arch/arm64/
arm/cortex-a35/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/instruction.json /tmp
/perf3/pmu-events/arch/arm64/arm/cortex-a710/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/trace.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/memory.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/co
rtex-a710/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/instruction.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/cache.json
/tmp/perf3/pmu-events/ar
ch/arm64/arm/cortex-a76/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/memory.json
/tmp/perf3/pmu-even
ts/arch/arm64/arm/cortex-a76/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/extra-metrics.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/branch.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/instructi
on.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/cache.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/bus.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/mem
ory.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/exception.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/extra-metricgroups.json
/tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/extra-metrics.json
/tmp/perf3/pmu-events/arch
/arm64/fujitsu/a64fx/branch.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/instruction.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/cache.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/other.json
/tmp/perf3/pmu-events/ar
ch/arm64/fujitsu/a64fx/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/bus.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/sve.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/cycle.json
/tmp/perf3/pmu-events/arch/arm
64/fujitsu/a64fx/memory.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/exception.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/ll_cache.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/spec_operation.json
/tmp/perf3/pmu-e
vents/arch/arm64/fujitsu/monaka/l3_cache.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/stall.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/tlb.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/general.json
/tmp/perf3/pmu
-events/arch/arm64/fujitsu/monaka/retired.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/gcycle.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/cycle_accounting.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/pipeline.jso
n /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/l1i_cache.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/fp_operation.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/core-imp-def.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu
/monaka/l1d_cache.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/sve.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/trace.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/energy.json
/tmp/perf3/pmu-events/arch/arm64/fujit
su/monaka/memory.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/exception.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/l2_cache.json
/tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/hwpf.json
/tmp/perf3/pmu-events/arch/arm64
/common-and-microarch.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/branch.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/instruction.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/cache.json
/tmp/perf3/pmu-ev
ents/arch/arm64/ampere/ampereonex/mmu.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/intrinsic.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/metrics.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/spe.json /tmp
/perf3/pmu-events/arch/arm64/ampere/ampereonex/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/core-imp-def.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/bus.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereo
nex/memory.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/exception.json
/tmp/perf3/pmu-events/arch/arm64/ampere/emag/branch.json
/tmp/perf3/pmu-events/arch/arm64/ampere/emag/instruction.json
/tmp/perf3/pmu-events/arch/arm64/amp
ere/emag/clock.json
/tmp/perf3/pmu-events/arch/arm64/ampere/emag/cache.json
/tmp/perf3/pmu-events/arch/arm64/ampere/emag/intrinsic.json
/tmp/perf3/pmu-events/arch/arm64/ampere/emag/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/ampere/em
ag/bus.json /tmp/perf3/pmu-events/arch/arm64/ampere/emag/memory.json
/tmp/perf3/pmu-events/arch/arm64/ampere/emag/exception.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/branch.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampere
one/instruction.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/cache.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/intrinsic.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/metrics.json
/tmp/perf3/pmu-events/arch/
arm64/ampere/ampereone/spe.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/pipeline.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/core-imp-def.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/bus.json
/tmp/perf3/pmu
-events/arch/arm64/ampere/ampereone/memory.json
/tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/exception.json
/tmp/perf3/pmu-events/arch/arm64/thead/yitian710/sys/ali_drw.json
/tmp/perf3/pmu-events/arch/arm64/thead/yitian710/sys/metri
cs.json /tmp/perf3/pmu-events/arch/arm64/recommended.json
/tmp/perf3/pmu-events/arch/arm64/cavium/thunderx2/core-imp-def.json
/tmp/perf3/pmu-events/arch/arm64/hisilicon/hip09/sys/uncore-cpa.json
/tmp/perf3/pmu-events/arch/arm64/hisilicon
/hip08/uncore-l3c.json
/tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08/metrics.json
/tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08/uncore-hha.json
/tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json
/tmp/perf3/pmu-event
s/arch/arm64/hisilicon/hip08/uncore-ddrc.json
 COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/memory.json
 COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/frontend.json
 COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/virtual-memory.json
 COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/pipeline.json
...
 COPY    /tmp/perf3/ <- pmu-events/arch/x86/knightslanding/uncore-cache.json
 COPY    /tmp/perf3/ <- pmu-events/arch/x86/knightslanding/cache.json
 GEN     /tmp/perf3/pmu-events/test-empty-pmu-events.c
 TEST    /tmp/perf3/pmu-events/empty-pmu-events.log
 GEN     /tmp/perf3/pmu-events/pmu-events.c
 CC      /tmp/perf3/pmu-events/pmu-events.o
 LD      /tmp/perf3/pmu-events/pmu-events-in.o
...
```

Thanks,
Ian
Re: [PATCH v1] perf build: Reduce pmu-events related copying and mkdirs
Posted by Arnaldo Carvalho de Melo 3 days, 21 hours ago
On Mon, Feb 02, 2026 at 10:27:25PM -0800, Ian Rogers wrote:
> On Mon, Feb 2, 2026 at 9:13 PM Ian Rogers <irogers@google.com> wrote:
> >
> > When building to an output directory the previous code would remove
> > files and then copy the source files over. Each source file copy would
> > have a rule to make its directory. All json for every architecture was
> > considered a source file. This led to unnecessary copying as a file
> > would be deleted and then the same file copied again, unnecessary
> > directory making, and copying of files not used in the build. A
> > side-effect would be a lot of build messages.
> >
> > This change makes it so that all computed output files are created and
> > then compared to all files in the OUTPUT directory. By filtering out
> > the files that would be copied, unnecessary files can be determined
> > and then deleted - note, this is a phony target which would remake the
> > pmu-events.c if always depended upon, and so the dependency is
> > conditional on there being files to remove. This has some overhead as
> > the $(OUTPUT)/pmu-events is "find" over rather than just "rm -fr", but
> > the savings from unnecessary copying, etc. should make up for this new
> > make overhead. The copy target just does copying but has a dependency
> > on the directory it needs being built, avoiding repetitive mkdirs. The
> > source files for copying only consider the JEVENTS_ARCH unless the
> > JEVENTS_ARCH is all. The metric json is only generated if appropriate,
> > rather than always being generated and jevents.py deciding whether or
> > not to use the files. The mypy and pylint targets are fixed as
> > variable names had changed but the rules not updated.
> >
> > The line count of a build with "make -C tools/perf O=/tmp/perf clean all"
> > prior to this change was 2181 lines, after this change it is 1596
> > lines. This is a reduction of 585 lines or about 27%.
> >
> > The generated pmu-events.c for JEVENTS_ARCH "x86" and "all" were
> > validated as being identical after this change.
> >
> > Signed-off-by: Ian Rogers <irogers@google.com>
> 
> I just wanted to add a note on testing this change. You can see the
> rules run by say building JEVENTS_ARCH=arm64 and then switching to
> JEVENTS_ARCH=x86. The first build will copy the arm64 json to the
> OUTPUT directory, the second will find the arm64 json shouldn't be in
> the OUTPUT directory and remove it while copying/generating in all the
> x86 json.

I'm getting this warning even after a 'make -C tools/ clean':

pmu-events/Build:136: warning: overriding recipe for target '/tmp/build/perf-tools-next/pmu-events/arch/common/common/legacy-cache.json'
pmu-events/Build:44: warning: ignoring old recipe for target '/tmp/build/perf-tools-next/pmu-events/arch/common/common/legacy-cache.json'


Everytime I build with:

⬢ [acme@toolbx perf-tools-next]$ alias m
alias m='rm -rf ~/libexec/perf-core/ ; make CORESIGHT=1 -k O=/tmp/build/$(basename $PWD)/ -C tools/perf install-bin && perf test import && cat /tmp/build/$(basename $PWD)/feature/test-all.make.output'
⬢ [acme@toolbx perf-tools-next]$

- Arnaldo

 
> ```
> $ make -C tools/perf O=/tmp/perf3 JEVENTS_ARCH=arm64 clean all
> ...
>  MKDIR   /tmp/perf3/pmu-events/arch/common/common
>  MKDIR   /tmp/perf3/pmu-events/arch/test/test_soc/sys
>  MKDIR   /tmp/perf3/pmu-events/arch/test/test_soc/cpu
>  COPY    /tmp/perf3/ <- pmu-events/arch/test/arch-std-events.json
>  MKDIR   /tmp/perf3/pmu-events/arch/arm64
>  MKDIR   /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08
>  MKDIR   /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip09/sys
>  MKDIR   /tmp/perf3/pmu-events/arch/arm64/cavium/thunderx2
>  COPY    /tmp/perf3/ <- pmu-events/arch/arm64/recommended.json
>  MKDIR   /tmp/perf3/pmu-events/arch/arm64/thead/yitian710/sys
>  MKDIR   /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone
>  MKDIR   /tmp/perf3/pmu-events/arch/arm64/ampere/emag
>  MKDIR   /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex
> ...
>  GEN     /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/extra-metrics.json
>  GEN     /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/extra-metrics.json
>  GEN     /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/extra-metrics.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/common/common/legacy-hardware.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/sys/uncore.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/metrics.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/uncore.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/other.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/cache.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/branch.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/arm64/mapfile.csv
>  COPY    /tmp/perf3/ <- pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json
>  ...
>  TEST    /tmp/perf3/pmu-events/empty-pmu-events.log
>  GEN     /tmp/perf3/pmu-events/pmu-events.c
> ...
> $ make -C tools/perf O=/tmp/perf3 JEVENTS_ARCH=x86 all
>  MKDIR   /tmp/perf3/pmu-events/arch/x86
>  MKDIR   /tmp/perf3/pmu-events/arch/x86/elkhartlake
>  MKDIR   /tmp/perf3/pmu-events/arch/x86/rocketlake
>  MKDIR   /tmp/perf3/pmu-events/arch/x86/broadwellde
> ...
>  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen1/extra-metrics.json
>  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen2/extra-metrics.json
>  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen3/extra-metrics.json
>  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen4/extra-metrics.json
>  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen5/extra-metrics.json
>  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen6/extra-metrics.json
>  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen1/extra-metricgroups.json
>  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen2/extra-metricgroups.json
> ...
>  COPY    /tmp/perf3/ <- pmu-events/arch/x86/mapfile.csv
>  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/ehl-metrics.json
>  RM      /tmp/perf3/pmu-events/arch/arm64/mapfile.csv
> /tmp/perf3/pmu-events/arch/arm64/sbsa.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mq/sys/ddrc.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mq/sys/metrics.json
> /tmp/per
> f3/pmu-events/arch/arm64/freescale/imx8mp/sys/ddrc.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mp/sys/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx93/sys/ddrc.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx93/sy
> s/metrics.json /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mm/sys/ddrc.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mm/sys/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mn/sys/ddrc.json
> /tmp/perf3/pmu-events/arch/
> arm64/freescale/imx8mn/sys/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx94/sys/ddrc.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx94/sys/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx91/sys/ddrc.json /tmp/
> perf3/pmu-events/arch/arm64/freescale/imx91/sys/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx95/sys/ddrc.json
> /tmp/perf3/pmu-events/arch/arm64/freescale/imx95/sys/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53
> /branch.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/other.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-
> a53/bus.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/extra-metrics.json
> /tmp/perf3/pmu-events/arc
> h/arm64/arm/cortex-a73/etm.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/instruction.json
> /tmp/perf3/pmu-events
> /arch/arm64/arm/cortex-a73/mmu.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/memory.json
> /tmp/perf3/pmu-events/
> arch/arm64/arm/cortex-a73/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/ll_cache
> .json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/spec_operation.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/l3_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/stall.json
> /tmp/perf3/pmu-events/arch/arm64/arm/ne
> overse-v1/tlb.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/general.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/retired.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/metrics.json
> /tmp/perf3/pmu-events/arch/arm64
> /arm/neoverse-v1/spe.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/l1i_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/fp_operation.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/bus.json
> /tmp/perf3/pmu-events/
> arch/arm64/arm/neoverse-v1/l1d_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/sve.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/exception.json
> /tmp/perf3/p
> mu-events/arch/arm64/arm/neoverse-v1/l2_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a
> 75/etm.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cort
> ex-a75/mmu.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/corte
> x-a75/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/branch.json
> /tmp/perf3/pmu
> -events/arch/arm64/arm/cortex-a65-e1/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/ifu.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/pipeline.j
> son /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-
> a65-e1/dpu.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
> /tmp/perf3/pmu-events/
> arch/arm64/arm/cmn/sys/metric.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/pipeline.json
> /tmp/perf3/p
> mu-events/arch/arm64/arm/cortex-a510/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/trace.json /tmp/perf3
> /pmu-events/arch/arm64/arm/cortex-a510/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neove
> rse-v3/ll_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/spec_operation.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/stall.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/general.json
> /tmp/perf3/pmu-events/arc
> h/arm64/arm/neoverse-v3/tlb.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/retired.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/brbe.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/metrics.json
> /tmp/perf3/pmu-events
> /arch/arm64/arm/neoverse-v3/spe.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/l1i_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/fp_operation.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/bus.json /tmp/perf3/
> pmu-events/arch/arm64/arm/neoverse-v3/l1d_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/sve.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/exception.json /
> tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/l2_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/a
> rm/cortex-a77/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/pipeline.json
> /tmp/perf3/pmu-events/arc
> h/arm64/arm/cortex-a77/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/extra-metricgroups.json
> /tmp/perf3
> /pmu-events/arch/arm64/arm/cortex-a77/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57
> -a72/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/exception.json
> /tmp/perf3/pmu-events/arch/ar
> m64/arm/cortex-a57-a72/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/ll_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/spec_op
> eration.json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/l3_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/stall.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/tlb.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neover
> se-n1/general.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/retired.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/spe.json
> /tmp/perf3/pmu-events/arch/arm64/arm
> /neoverse-n1/l1i_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/l1d_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/memory.json
> /tmp/perf3/pmu-events/arch
> /arm64/arm/neoverse-n1/l2_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/extra-metrics.
> json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/ll_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l3_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/spec_operation.json
> /tmp/perf3/pmu-events/arch/arm64/arm/
> neoverse-n3/stall.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/tlb.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/general.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/retired.json
> /tmp/perf3/pmu-events/arch/arm64
> /arm/neoverse-n3/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/spe.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l1i_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/fp_operation.json
> /tmp/perf3/pmu-eve
> nts/arch/arm64/arm/neoverse-n3/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l1d_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/sve.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/trace.json
> /tmp/perf3/pmu-
> events/arch/arm64/arm/neoverse-n3/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l2_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/extra-metricgro
> ups.json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/
> cortex-x1/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cor
> tex-x1/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/branch.json
> /tmp/perf3/pmu-even
> ts/arch/arm64/arm/cortex-x2/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/bus.json
> /tmp/perf3/pmu-ev
> ents/arch/arm64/arm/cortex-x2/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/trace.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/extra-metricgroups.json
> /tmp
> /perf3/pmu-events/arch/arm64/arm/cortex-x2/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/ca
> che.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/
> extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/instruction.json
> /tmp/perf3/pmu-events
> /arch/arm64/arm/cortex-a55/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/bus.json
> /tmp/perf3/pmu-event
> s/arch/arm64/arm/cortex-a55/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/spe
> c_operation.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/ll_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l3_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/stall.json
> /tmp/perf3/pmu-events/arc
> h/arm64/arm/neoverse-n2-v2/tlb.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/general.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/retired.json
> /tmp/p
> erf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/spe.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l1i_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/fp_operation.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse
> -n2-v2/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l1d_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/sve.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/trace.json
> /tmp/perf3/pmu-events/arch/arm
> 64/arm/neoverse-n2-v2/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l2_cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/extra-metricgroups
> .json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/branch.json
> /tmp/perf3/pmu-events/arch/arm64/ar
> m/cortex-a35/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/exception.json
> /tmp/perf3/pmu-events/arch/arm64/
> arm/cortex-a35/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/instruction.json /tmp
> /perf3/pmu-events/arch/arm64/arm/cortex-a710/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/trace.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/memory.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/co
> rtex-a710/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/cache.json
> /tmp/perf3/pmu-events/ar
> ch/arm64/arm/cortex-a76/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/memory.json
> /tmp/perf3/pmu-even
> ts/arch/arm64/arm/cortex-a76/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/extra-metrics.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/branch.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/instructi
> on.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/cache.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/bus.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/mem
> ory.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/exception.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/extra-metricgroups.json
> /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/extra-metrics.json
> /tmp/perf3/pmu-events/arch
> /arm64/fujitsu/a64fx/branch.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/cache.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/other.json
> /tmp/perf3/pmu-events/ar
> ch/arm64/fujitsu/a64fx/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/bus.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/sve.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/cycle.json
> /tmp/perf3/pmu-events/arch/arm
> 64/fujitsu/a64fx/memory.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/exception.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/ll_cache.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/spec_operation.json
> /tmp/perf3/pmu-e
> vents/arch/arm64/fujitsu/monaka/l3_cache.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/stall.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/tlb.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/general.json
> /tmp/perf3/pmu
> -events/arch/arm64/fujitsu/monaka/retired.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/gcycle.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/cycle_accounting.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/pipeline.jso
> n /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/l1i_cache.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/fp_operation.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/core-imp-def.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu
> /monaka/l1d_cache.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/sve.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/trace.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/energy.json
> /tmp/perf3/pmu-events/arch/arm64/fujit
> su/monaka/memory.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/exception.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/l2_cache.json
> /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/hwpf.json
> /tmp/perf3/pmu-events/arch/arm64
> /common-and-microarch.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/branch.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/cache.json
> /tmp/perf3/pmu-ev
> ents/arch/arm64/ampere/ampereonex/mmu.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/intrinsic.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/spe.json /tmp
> /perf3/pmu-events/arch/arm64/ampere/ampereonex/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/core-imp-def.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/bus.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereo
> nex/memory.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/exception.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/emag/branch.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/emag/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/amp
> ere/emag/clock.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/emag/cache.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/emag/intrinsic.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/emag/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/em
> ag/bus.json /tmp/perf3/pmu-events/arch/arm64/ampere/emag/memory.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/emag/exception.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/branch.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampere
> one/instruction.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/cache.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/intrinsic.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/metrics.json
> /tmp/perf3/pmu-events/arch/
> arm64/ampere/ampereone/spe.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/pipeline.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/core-imp-def.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/bus.json
> /tmp/perf3/pmu
> -events/arch/arm64/ampere/ampereone/memory.json
> /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/exception.json
> /tmp/perf3/pmu-events/arch/arm64/thead/yitian710/sys/ali_drw.json
> /tmp/perf3/pmu-events/arch/arm64/thead/yitian710/sys/metri
> cs.json /tmp/perf3/pmu-events/arch/arm64/recommended.json
> /tmp/perf3/pmu-events/arch/arm64/cavium/thunderx2/core-imp-def.json
> /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip09/sys/uncore-cpa.json
> /tmp/perf3/pmu-events/arch/arm64/hisilicon
> /hip08/uncore-l3c.json
> /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08/metrics.json
> /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08/uncore-hha.json
> /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json
> /tmp/perf3/pmu-event
> s/arch/arm64/hisilicon/hip08/uncore-ddrc.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/memory.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/frontend.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/virtual-memory.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/pipeline.json
> ...
>  COPY    /tmp/perf3/ <- pmu-events/arch/x86/knightslanding/uncore-cache.json
>  COPY    /tmp/perf3/ <- pmu-events/arch/x86/knightslanding/cache.json
>  GEN     /tmp/perf3/pmu-events/test-empty-pmu-events.c
>  TEST    /tmp/perf3/pmu-events/empty-pmu-events.log
>  GEN     /tmp/perf3/pmu-events/pmu-events.c
>  CC      /tmp/perf3/pmu-events/pmu-events.o
>  LD      /tmp/perf3/pmu-events/pmu-events-in.o
> ...
> ```
> 
> Thanks,
> Ian
Re: [PATCH v1] perf build: Reduce pmu-events related copying and mkdirs
Posted by Ian Rogers 3 days, 19 hours ago
On Tue, Feb 3, 2026 at 6:50 AM Arnaldo Carvalho de Melo <acme@kernel.org> wrote:
>
> On Mon, Feb 02, 2026 at 10:27:25PM -0800, Ian Rogers wrote:
> > On Mon, Feb 2, 2026 at 9:13 PM Ian Rogers <irogers@google.com> wrote:
> > >
> > > When building to an output directory the previous code would remove
> > > files and then copy the source files over. Each source file copy would
> > > have a rule to make its directory. All json for every architecture was
> > > considered a source file. This led to unnecessary copying as a file
> > > would be deleted and then the same file copied again, unnecessary
> > > directory making, and copying of files not used in the build. A
> > > side-effect would be a lot of build messages.
> > >
> > > This change makes it so that all computed output files are created and
> > > then compared to all files in the OUTPUT directory. By filtering out
> > > the files that would be copied, unnecessary files can be determined
> > > and then deleted - note, this is a phony target which would remake the
> > > pmu-events.c if always depended upon, and so the dependency is
> > > conditional on there being files to remove. This has some overhead as
> > > the $(OUTPUT)/pmu-events is "find" over rather than just "rm -fr", but
> > > the savings from unnecessary copying, etc. should make up for this new
> > > make overhead. The copy target just does copying but has a dependency
> > > on the directory it needs being built, avoiding repetitive mkdirs. The
> > > source files for copying only consider the JEVENTS_ARCH unless the
> > > JEVENTS_ARCH is all. The metric json is only generated if appropriate,
> > > rather than always being generated and jevents.py deciding whether or
> > > not to use the files. The mypy and pylint targets are fixed as
> > > variable names had changed but the rules not updated.
> > >
> > > The line count of a build with "make -C tools/perf O=/tmp/perf clean all"
> > > prior to this change was 2181 lines, after this change it is 1596
> > > lines. This is a reduction of 585 lines or about 27%.
> > >
> > > The generated pmu-events.c for JEVENTS_ARCH "x86" and "all" were
> > > validated as being identical after this change.
> > >
> > > Signed-off-by: Ian Rogers <irogers@google.com>
> >
> > I just wanted to add a note on testing this change. You can see the
> > rules run by say building JEVENTS_ARCH=arm64 and then switching to
> > JEVENTS_ARCH=x86. The first build will copy the arm64 json to the
> > OUTPUT directory, the second will find the arm64 json shouldn't be in
> > the OUTPUT directory and remove it while copying/generating in all the
> > x86 json.
>
> I'm getting this warning even after a 'make -C tools/ clean':
>
> pmu-events/Build:136: warning: overriding recipe for target '/tmp/build/perf-tools-next/pmu-events/arch/common/common/legacy-cache.json'
> pmu-events/Build:44: warning: ignoring old recipe for target '/tmp/build/perf-tools-next/pmu-events/arch/common/common/legacy-cache.json'
>
>
> Everytime I build with:
>
> ⬢ [acme@toolbx perf-tools-next]$ alias m
> alias m='rm -rf ~/libexec/perf-core/ ; make CORESIGHT=1 -k O=/tmp/build/$(basename $PWD)/ -C tools/perf install-bin && perf test import && cat /tmp/build/$(basename $PWD)/feature/test-all.make.output'
> ⬢ [acme@toolbx perf-tools-next]$

Thanks, the issue is that there is a find to create SRC_JSON:
```
SRC_DIR := pmu-events/arch
ifeq ($(JEVENTS_ARCH),all)
SRC_JSON := $(shell find $(SRC_DIR) -name '*.json' -o -name '*.csv')
else
SRC_JSON := $(shell find $(SRC_DIR)/common $(SRC_DIR)/test
$(SRC_DIR)/$(JEVENTS_ARCH) -name '*.json' -o -name '*.csv')
endif
```
which will pick up generated json from a build in the tools/perf
directory. Doing "cd tools/perf; make clean" will resolve this. The
problem happens as we generate a copy rule for every file in SRC_JSON
and for generated files the target names match:
```
define COPY_RULE
$(2): $(1) | $(3)
$$(Q)$$(call echo-cmd,cp)cp $(1) $(2)
endef
$(foreach src,$(SRC_JSON), \
    $(eval dest := $(patsubst $(SRC_DIR)/%,$(OUT_DIR)/%,$(src))) \
    $(eval ddir := $(patsubst %/,%,$(dir $(dest)))) \
    $(eval $(call COPY_RULE,$(src),$(dest),$(ddir))) \
)
```
I've created a v2 patch that avoids generating a copy rule if the
destination matches something in GEN_JSON, which does the right thing
wrt generating rather than copying, and it also avoids the warning.

Thanks,
Ian

> - Arnaldo
>
>
> > ```
> > $ make -C tools/perf O=/tmp/perf3 JEVENTS_ARCH=arm64 clean all
> > ...
> >  MKDIR   /tmp/perf3/pmu-events/arch/common/common
> >  MKDIR   /tmp/perf3/pmu-events/arch/test/test_soc/sys
> >  MKDIR   /tmp/perf3/pmu-events/arch/test/test_soc/cpu
> >  COPY    /tmp/perf3/ <- pmu-events/arch/test/arch-std-events.json
> >  MKDIR   /tmp/perf3/pmu-events/arch/arm64
> >  MKDIR   /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08
> >  MKDIR   /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip09/sys
> >  MKDIR   /tmp/perf3/pmu-events/arch/arm64/cavium/thunderx2
> >  COPY    /tmp/perf3/ <- pmu-events/arch/arm64/recommended.json
> >  MKDIR   /tmp/perf3/pmu-events/arch/arm64/thead/yitian710/sys
> >  MKDIR   /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone
> >  MKDIR   /tmp/perf3/pmu-events/arch/arm64/ampere/emag
> >  MKDIR   /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex
> > ...
> >  GEN     /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/extra-metrics.json
> >  GEN     /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/extra-metrics.json
> >  GEN     /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/extra-metrics.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/common/common/legacy-hardware.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/sys/uncore.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/metrics.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/uncore.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/other.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/cache.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/test/test_soc/cpu/branch.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/arm64/mapfile.csv
> >  COPY    /tmp/perf3/ <- pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json
> >  ...
> >  TEST    /tmp/perf3/pmu-events/empty-pmu-events.log
> >  GEN     /tmp/perf3/pmu-events/pmu-events.c
> > ...
> > $ make -C tools/perf O=/tmp/perf3 JEVENTS_ARCH=x86 all
> >  MKDIR   /tmp/perf3/pmu-events/arch/x86
> >  MKDIR   /tmp/perf3/pmu-events/arch/x86/elkhartlake
> >  MKDIR   /tmp/perf3/pmu-events/arch/x86/rocketlake
> >  MKDIR   /tmp/perf3/pmu-events/arch/x86/broadwellde
> > ...
> >  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen1/extra-metrics.json
> >  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen2/extra-metrics.json
> >  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen3/extra-metrics.json
> >  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen4/extra-metrics.json
> >  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen5/extra-metrics.json
> >  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen6/extra-metrics.json
> >  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen1/extra-metricgroups.json
> >  GEN     /tmp/perf3/pmu-events/arch/x86/amdzen2/extra-metricgroups.json
> > ...
> >  COPY    /tmp/perf3/ <- pmu-events/arch/x86/mapfile.csv
> >  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/ehl-metrics.json
> >  RM      /tmp/perf3/pmu-events/arch/arm64/mapfile.csv
> > /tmp/perf3/pmu-events/arch/arm64/sbsa.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mq/sys/ddrc.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mq/sys/metrics.json
> > /tmp/per
> > f3/pmu-events/arch/arm64/freescale/imx8mp/sys/ddrc.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mp/sys/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx93/sys/ddrc.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx93/sy
> > s/metrics.json /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mm/sys/ddrc.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mm/sys/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx8mn/sys/ddrc.json
> > /tmp/perf3/pmu-events/arch/
> > arm64/freescale/imx8mn/sys/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx94/sys/ddrc.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx94/sys/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx91/sys/ddrc.json /tmp/
> > perf3/pmu-events/arch/arm64/freescale/imx91/sys/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx95/sys/ddrc.json
> > /tmp/perf3/pmu-events/arch/arm64/freescale/imx95/sys/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53
> > /branch.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/other.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-
> > a53/bus.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a53/extra-metrics.json
> > /tmp/perf3/pmu-events/arc
> > h/arm64/arm/cortex-a73/etm.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/instruction.json
> > /tmp/perf3/pmu-events
> > /arch/arm64/arm/cortex-a73/mmu.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/memory.json
> > /tmp/perf3/pmu-events/
> > arch/arm64/arm/cortex-a73/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a73/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/ll_cache
> > .json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/spec_operation.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/l3_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/stall.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/ne
> > overse-v1/tlb.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/general.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/retired.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64
> > /arm/neoverse-v1/spe.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/l1i_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/fp_operation.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/bus.json
> > /tmp/perf3/pmu-events/
> > arch/arm64/arm/neoverse-v1/l1d_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/sve.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/exception.json
> > /tmp/perf3/p
> > mu-events/arch/arm64/arm/neoverse-v1/l2_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v1/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a
> > 75/etm.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cort
> > ex-a75/mmu.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/corte
> > x-a75/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a75/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/branch.json
> > /tmp/perf3/pmu
> > -events/arch/arm64/arm/cortex-a65-e1/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/ifu.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/pipeline.j
> > son /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-
> > a65-e1/dpu.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a65-e1/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cmn/sys/cmn.json
> > /tmp/perf3/pmu-events/
> > arch/arm64/arm/cmn/sys/metric.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/pipeline.json
> > /tmp/perf3/p
> > mu-events/arch/arm64/arm/cortex-a510/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/trace.json /tmp/perf3
> > /pmu-events/arch/arm64/arm/cortex-a510/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a510/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neove
> > rse-v3/ll_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/spec_operation.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/stall.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/general.json
> > /tmp/perf3/pmu-events/arc
> > h/arm64/arm/neoverse-v3/tlb.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/retired.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/brbe.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/metrics.json
> > /tmp/perf3/pmu-events
> > /arch/arm64/arm/neoverse-v3/spe.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/l1i_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/fp_operation.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/bus.json /tmp/perf3/
> > pmu-events/arch/arm64/arm/neoverse-v3/l1d_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/sve.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/exception.json /
> > tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/l2_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-v3/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/a
> > rm/cortex-a77/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/pipeline.json
> > /tmp/perf3/pmu-events/arc
> > h/arm64/arm/cortex-a77/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a77/extra-metricgroups.json
> > /tmp/perf3
> > /pmu-events/arch/arm64/arm/cortex-a77/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57
> > -a72/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/exception.json
> > /tmp/perf3/pmu-events/arch/ar
> > m64/arm/cortex-a57-a72/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a57-a72/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/ll_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/spec_op
> > eration.json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/l3_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/stall.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/tlb.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neover
> > se-n1/general.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/retired.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/spe.json
> > /tmp/perf3/pmu-events/arch/arm64/arm
> > /neoverse-n1/l1i_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/l1d_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/memory.json
> > /tmp/perf3/pmu-events/arch
> > /arm64/arm/neoverse-n1/l2_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n1/extra-metrics.
> > json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/ll_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l3_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/spec_operation.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/
> > neoverse-n3/stall.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/tlb.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/general.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/retired.json
> > /tmp/perf3/pmu-events/arch/arm64
> > /arm/neoverse-n3/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/spe.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l1i_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/fp_operation.json
> > /tmp/perf3/pmu-eve
> > nts/arch/arm64/arm/neoverse-n3/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l1d_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/sve.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/trace.json
> > /tmp/perf3/pmu-
> > events/arch/arm64/arm/neoverse-n3/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/l2_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/extra-metricgro
> > ups.json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n3/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/
> > cortex-x1/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cor
> > tex-x1/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x1/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/branch.json
> > /tmp/perf3/pmu-even
> > ts/arch/arm64/arm/cortex-x2/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/bus.json
> > /tmp/perf3/pmu-ev
> > ents/arch/arm64/arm/cortex-x2/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/trace.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-x2/extra-metricgroups.json
> > /tmp
> > /perf3/pmu-events/arch/arm64/arm/cortex-x2/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/ca
> > che.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/
> > extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a34/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/instruction.json
> > /tmp/perf3/pmu-events
> > /arch/arm64/arm/cortex-a55/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/bus.json
> > /tmp/perf3/pmu-event
> > s/arch/arm64/arm/cortex-a55/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a55/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/spe
> > c_operation.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/ll_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l3_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/stall.json
> > /tmp/perf3/pmu-events/arc
> > h/arm64/arm/neoverse-n2-v2/tlb.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/general.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/retired.json
> > /tmp/p
> > erf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/spe.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l1i_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/fp_operation.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse
> > -n2-v2/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l1d_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/sve.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/trace.json
> > /tmp/perf3/pmu-events/arch/arm
> > 64/arm/neoverse-n2-v2/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/l2_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/extra-metricgroups
> > .json /tmp/perf3/pmu-events/arch/arm64/arm/neoverse-n2-v2/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/ar
> > m/cortex-a35/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/
> > arm/cortex-a35/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a35/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/instruction.json /tmp
> > /perf3/pmu-events/arch/arm64/arm/cortex-a710/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/trace.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a710/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/co
> > rtex-a710/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/cache.json
> > /tmp/perf3/pmu-events/ar
> > ch/arm64/arm/cortex-a76/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/memory.json
> > /tmp/perf3/pmu-even
> > ts/arch/arm64/arm/cortex-a76/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a76/extra-metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/instructi
> > on.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/mem
> > ory.json /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/extra-metricgroups.json
> > /tmp/perf3/pmu-events/arch/arm64/arm/cortex-a78/extra-metrics.json
> > /tmp/perf3/pmu-events/arch
> > /arm64/fujitsu/a64fx/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/other.json
> > /tmp/perf3/pmu-events/ar
> > ch/arm64/fujitsu/a64fx/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/sve.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/cycle.json
> > /tmp/perf3/pmu-events/arch/arm
> > 64/fujitsu/a64fx/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/a64fx/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/ll_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/spec_operation.json
> > /tmp/perf3/pmu-e
> > vents/arch/arm64/fujitsu/monaka/l3_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/stall.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/tlb.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/general.json
> > /tmp/perf3/pmu
> > -events/arch/arm64/fujitsu/monaka/retired.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/gcycle.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/cycle_accounting.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/pipeline.jso
> > n /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/l1i_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/fp_operation.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/core-imp-def.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu
> > /monaka/l1d_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/sve.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/trace.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/energy.json
> > /tmp/perf3/pmu-events/arch/arm64/fujit
> > su/monaka/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/l2_cache.json
> > /tmp/perf3/pmu-events/arch/arm64/fujitsu/monaka/hwpf.json
> > /tmp/perf3/pmu-events/arch/arm64
> > /common-and-microarch.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/cache.json
> > /tmp/perf3/pmu-ev
> > ents/arch/arm64/ampere/ampereonex/mmu.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/intrinsic.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/spe.json /tmp
> > /perf3/pmu-events/arch/arm64/ampere/ampereonex/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/core-imp-def.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/bus.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereo
> > nex/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereonex/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/emag/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/emag/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/amp
> > ere/emag/clock.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/emag/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/emag/intrinsic.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/emag/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/em
> > ag/bus.json /tmp/perf3/pmu-events/arch/arm64/ampere/emag/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/emag/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/branch.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampere
> > one/instruction.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/cache.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/intrinsic.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/metrics.json
> > /tmp/perf3/pmu-events/arch/
> > arm64/ampere/ampereone/spe.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/pipeline.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/core-imp-def.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/bus.json
> > /tmp/perf3/pmu
> > -events/arch/arm64/ampere/ampereone/memory.json
> > /tmp/perf3/pmu-events/arch/arm64/ampere/ampereone/exception.json
> > /tmp/perf3/pmu-events/arch/arm64/thead/yitian710/sys/ali_drw.json
> > /tmp/perf3/pmu-events/arch/arm64/thead/yitian710/sys/metri
> > cs.json /tmp/perf3/pmu-events/arch/arm64/recommended.json
> > /tmp/perf3/pmu-events/arch/arm64/cavium/thunderx2/core-imp-def.json
> > /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip09/sys/uncore-cpa.json
> > /tmp/perf3/pmu-events/arch/arm64/hisilicon
> > /hip08/uncore-l3c.json
> > /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08/metrics.json
> > /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08/uncore-hha.json
> > /tmp/perf3/pmu-events/arch/arm64/hisilicon/hip08/core-imp-def.json
> > /tmp/perf3/pmu-event
> > s/arch/arm64/hisilicon/hip08/uncore-ddrc.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/memory.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/frontend.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/virtual-memory.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/x86/elkhartlake/pipeline.json
> > ...
> >  COPY    /tmp/perf3/ <- pmu-events/arch/x86/knightslanding/uncore-cache.json
> >  COPY    /tmp/perf3/ <- pmu-events/arch/x86/knightslanding/cache.json
> >  GEN     /tmp/perf3/pmu-events/test-empty-pmu-events.c
> >  TEST    /tmp/perf3/pmu-events/empty-pmu-events.log
> >  GEN     /tmp/perf3/pmu-events/pmu-events.c
> >  CC      /tmp/perf3/pmu-events/pmu-events.o
> >  LD      /tmp/perf3/pmu-events/pmu-events-in.o
> > ...
> > ```
> >
> > Thanks,
> > Ian
[PATCH v2] perf build: Reduce pmu-events related copying and mkdirs
Posted by Ian Rogers 3 days, 19 hours ago
When building to an output directory the previous code would remove
files and then copy the source files over. Each source file copy would
have a rule to make its directory. All json for every architecture was
considered a source file. This led to unnecessary copying as a file
would be deleted and then the same file copied again, unnecessary
directory making, and copying of files not used in the build. A
side-effect would be a lot of build messages.

This change makes it so that all computed output files are created and
then compared to all files in the OUTPUT directory. By filtering out
the files that would be copied, unnecessary files can be determined
and then deleted - note, this is a phony target which would remake the
pmu-events.c if always depended upon, and so the dependency is
conditional on there being files to remove. This has some overhead as
the $(OUTPUT)/pmu-events is "find" over rather than just "rm -fr", but
the savings from unnecessary copying, etc. should make up for this new
make overhead. The copy target just does copying but has a dependency
on the directory it needs being built, avoiding repetitive mkdirs. The
source files for copying only consider the JEVENTS_ARCH unless the
JEVENTS_ARCH is all. The metric json is only generated if appropriate,
rather than always being generated and jevents.py deciding whether or
not to use the files. The mypy and pylint targets are fixed as
variable names had changed but the rules not updated.

The line count of a build with "make -C tools/perf O=/tmp/perf clean all"
prior to this change was 2181 lines, after this change it is 1596
lines. This is a reduction of 585 lines or about 27%.

The generated pmu-events.c for JEVENTS_ARCH "x86" and "all" were
validated as being identical after this change.

Signed-off-by: Ian Rogers <irogers@google.com>
---
v2: Avoid creating a COPY_RULE for a file that is in GEN_JSON,
    something that happens if builds aren't cleaned up, as described
    in a reply to the v1 patch:
    https://lore.kernel.org/lkml/20260203051327.2836070-1-irogers@google.com/
---
 tools/perf/pmu-events/Build | 217 +++++++++++++++++++++++++-----------
 1 file changed, 149 insertions(+), 68 deletions(-)

diff --git a/tools/perf/pmu-events/Build b/tools/perf/pmu-events/Build
index ec964ed05974..63c65788d442 100644
--- a/tools/perf/pmu-events/Build
+++ b/tools/perf/pmu-events/Build
@@ -1,63 +1,61 @@
-pmu-events-y	+= pmu-events.o
-JSON		=  $(shell find pmu-events/arch -name '*.json' -o -name '*.csv')
-JSON_DIRS	=  $(shell find pmu-events/arch -type d)
-JDIR_TEST	=  pmu-events/arch/test
-JSON_TEST	=  $(shell [ -d $(JDIR_TEST) ] &&			\
-			find $(JDIR_TEST) -name '*.json')
-JEVENTS_PY	=  pmu-events/jevents.py
-METRIC_PY	=  pmu-events/metric.py
-METRIC_TEST_PY	=  pmu-events/metric_test.py
 EMPTY_PMU_EVENTS_C = pmu-events/empty-pmu-events.c
+# pmu-events.c will be generated by jevents.py or copied from EMPTY_PMU_EVENTS_C
 PMU_EVENTS_C	=  $(OUTPUT)pmu-events/pmu-events.c
-METRIC_TEST_LOG	=  $(OUTPUT)pmu-events/metric_test.log
-TEST_EMPTY_PMU_EVENTS_C = $(OUTPUT)pmu-events/test-empty-pmu-events.c
-EMPTY_PMU_EVENTS_TEST_LOG = $(OUTPUT)pmu-events/empty-pmu-events.log
-LEGACY_CACHE_PY	=  pmu-events/make_legacy_cache.py
-LEGACY_CACHE_JSON = $(OUTPUT)pmu-events/arch/common/common/legacy-cache.json
+pmu-events-y	+= pmu-events.o
 
-ifeq ($(JEVENTS_ARCH),)
-JEVENTS_ARCH=$(SRCARCH)
-endif
-JEVENTS_MODEL ?= all
+# pmu-events.c file is generated in the OUTPUT directory so it needs a
+# separate rule to depend on it properly
+$(OUTPUT)pmu-events/pmu-events.o: $(PMU_EVENTS_C)
+	$(call rule_mkdir)
+	$(call if_changed_dep,cc_o_c)
 
-#
-# Locate/process JSON files in pmu-events/arch/
-# directory and create tables in pmu-events.c.
-#
+# Message for $(call echo-cmd,cp), possibly remove the src file from
+# the destination to save space in the build log.
+quiet_cmd_cp   = COPY    $(patsubst %$<,%,$@) <- $<
 
+# --- NO_JEVENTS=1 build ---
 ifeq ($(NO_JEVENTS),1)
 $(PMU_EVENTS_C): $(EMPTY_PMU_EVENTS_C)
 	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,gen)cp $< $@
+	$(Q)$(call echo-cmd,cp)cp $< $@
 else
-# Functions to extract the model from a extra-metrics.json or extra-metricgroups.json path.
-model_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/extra-metric.*\.json@\1@')
-vendor_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/[^/]*/extra-metric.*\.json@\1@')
+# --- Regular build ---
 
-# Copy checked-in json to OUTPUT for generation if it's an out of source build
-ifneq ($(OUTPUT),)
-# Remove all output directories when any source directory timestamp changes
-# so there are no stale deleted files
-JSON_DIRS_ROOT = $(OUTPUT)pmu-events/arch/
-$(JSON_DIRS_ROOT): $(JSON_DIRS)
-	$(Q)$(call echo-cmd,gen)rm -rf $@
-	$(Q)mkdir -p $@
+# Setup the JEVENTS_ARCH and JEVENTS_MODEL
+ifeq ($(JEVENTS_ARCH),)
+JEVENTS_ARCH=$(SRCARCH)
+endif
+JEVENTS_MODEL ?= all
 
-$(OUTPUT)pmu-events/arch/%: pmu-events/arch/% $(JSON_DIRS_ROOT)
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,gen)cp $< $@
+# The input json/csv files
+SRC_DIR		:= pmu-events/arch
+ifeq ($(JEVENTS_ARCH),all)
+SRC_JSON	:= $(shell find $(SRC_DIR) -name '*.json' -o -name '*.csv')
+else
+SRC_JSON	:= $(shell find $(SRC_DIR)/common $(SRC_DIR)/test $(SRC_DIR)/$(JEVENTS_ARCH) -name '*.json' -o -name '*.csv')
 endif
 
-$(LEGACY_CACHE_JSON): $(LEGACY_CACHE_PY) $(JSON_DIRS_ROOT)
+# Python to build the generic legacy cache events
+LEGACY_CACHE_PY	=  pmu-events/make_legacy_cache.py
+LEGACY_CACHE_JSON = $(OUTPUT)pmu-events/arch/common/common/legacy-cache.json
+GEN_JSON = $(LEGACY_CACHE_JSON)
+
+$(LEGACY_CACHE_JSON): $(LEGACY_CACHE_PY)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $(LEGACY_CACHE_PY) > $@
 
+# Python to generate architectural metrics
 GEN_METRIC_DEPS := pmu-events/metric.py pmu-events/common_metrics.py
+# Functions to extract the model from an extra-metrics.json or extra-metricgroups.json path.
+model_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/extra-metric.*\.json@\1@')
+vendor_name = $(shell echo $(1)|sed -e 's@.\+/\(.*\)/[^/]*/extra-metric.*\.json@\1@')
 
+ifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),x86 all))
 # Generate AMD Json
 ZENS = $(shell ls -d pmu-events/arch/x86/amdzen*)
 ZEN_METRICS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metrics.json)
 ZEN_METRICGROUPS = $(foreach x,$(ZENS),$(OUTPUT)$(x)/extra-metricgroups.json)
+GEN_JSON += $(ZEN_METRICS) $(ZEN_METRICGROUPS)
 
 $(ZEN_METRICS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
@@ -67,10 +65,14 @@ $(ZEN_METRICGROUPS): pmu-events/amd_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@
 
+endif
+
+ifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),arm64 all))
 # Generate ARM Json
 ARMS = $(shell ls -d pmu-events/arch/arm64/arm/*|grep -v cmn)
 ARM_METRICS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metrics.json)
 ARM_METRICGROUPS = $(foreach x,$(ARMS),$(OUTPUT)$(x)/extra-metricgroups.json)
+GEN_JSON += $(ARM_METRICS) $(ARM_METRICGROUPS)
 
 $(ARM_METRICS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
@@ -80,10 +82,14 @@ $(ARM_METRICGROUPS): pmu-events/arm64_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call vendor_name,$@) $(call model_name,$@) pmu-events/arch > $@
 
+endif
+
+ifeq ($(JEVENTS_ARCH),$(filter $(JEVENTS_ARCH),x86 all))
 # Generate Intel Json
 INTELS = $(shell ls -d pmu-events/arch/x86/*|grep -v amdzen|grep -v mapfile.csv)
 INTEL_METRICS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metrics.json)
 INTEL_METRICGROUPS = $(foreach x,$(INTELS),$(OUTPUT)$(x)/extra-metricgroups.json)
+GEN_JSON += $(INTEL_METRICS) $(INTEL_METRICGROUPS)
 
 $(INTEL_METRICS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
@@ -93,18 +99,69 @@ $(INTEL_METRICGROUPS): pmu-events/intel_metrics.py $(GEN_METRIC_DEPS)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $< -metricgroups $(call model_name,$@) pmu-events/arch > $@
 
-GEN_JSON = $(patsubst %,$(OUTPUT)%,$(JSON)) \
-            $(LEGACY_CACHE_JSON) \
-            $(JSON_DIRS) \
-            $(ZEN_METRICS) $(ZEN_METRICGROUPS) \
-            $(ARM_METRICS) $(ARM_METRICGROUPS) \
-            $(INTEL_METRICS) $(INTEL_METRICGROUPS)
+endif
+
+OUT_DIR		:= $(OUTPUT)pmu-events/arch
+
+ifeq ($(OUTPUT),)
+OUT_JSON	:= $(SRC_JSON)
+ORPHAN_FILES	:=
+else
+# Things that need to be built in the OUTPUT directory. Note, ensure
+# there is a slash after the directory name so that it matches what
+# $(dir) gives in COPY_RULE.
+OUT_JSON	:= $(patsubst $(SRC_DIR)/%,$(OUT_DIR)/%,$(SRC_JSON))
+OUT_DIRS	:= $(sort $(patsubst %/,%,$(dir $(OUT_JSON))))
+
+# Things already in the OUTPUT directory
+CUR_OUT_JSON	:= $(shell [ -d $(OUT_DIR) ] && find $(OUT_DIR) -type f)
+
+# Things in the OUTPUT directory but shouldn't be there as computed by
+# OUT_JSON and GEN_JSON.
+ORPHAN_FILES	:= $(filter-out $(OUT_JSON) $(GEN_JSON),$(CUR_OUT_JSON))
+
+# Message for $(call echo-cmd,mkd). There is already a mkdir message
+# but it assumes $@ is a file to mkdir the directory for.
+quiet_cmd_mkd  = MKDIR   $@
+
+$(OUT_DIRS):
+	$(Q)$(call echo-cmd,mkd)mkdir -p $@
+
+# Explicitly generate rules to copy SRC_JSON files as $(dir) cannot
+# apply to $@ in a dependency. Exclude from the copy rules any that
+# look like they are copying generated json. This happens as a perf
+# build within the tools/perf directory will leave generated json
+# files within the tree, these then get picked up by SRC_JSON find.
+define COPY_RULE
+$(2): $(1) | $(3)
+	$$(Q)$$(call echo-cmd,cp)cp $(1) $(2)
+endef
+$(foreach src,$(SRC_JSON), \
+    $(eval dest := $(patsubst $(SRC_DIR)/%,$(OUT_DIR)/%,$(src))) \
+    $(eval ddir := $(patsubst %/,%,$(dir $(dest)))) \
+    $(if $(filter $(dest),$(GEN_JSON)),, \
+        $(eval $(call COPY_RULE,$(src),$(dest),$(ddir))) \
+    ) \
+)
+
+endif # ifneq ($(OUTPUT),)
+
+JEVENTS_PY	=  pmu-events/jevents.py
+METRIC_PY	=  pmu-events/metric.py
+
+# Rule to run the metric test.
+METRIC_TEST_PY	=  pmu-events/metric_test.py
+METRIC_TEST_LOG	=  $(OUTPUT)pmu-events/metric_test.log
 
 $(METRIC_TEST_LOG): $(METRIC_TEST_PY) $(METRIC_PY)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,test)$(PYTHON) $< 2> $@ || (cat $@ && false)
 
-$(TEST_EMPTY_PMU_EVENTS_C): $(GEN_JSON) $(JSON_TEST) $(JEVENTS_PY) $(METRIC_PY) $(METRIC_TEST_LOG)
+# Rule to create then ensure the empty-pmu-events.c is in sync.
+TEST_EMPTY_PMU_EVENTS_C = $(OUTPUT)pmu-events/test-empty-pmu-events.c
+EMPTY_PMU_EVENTS_TEST_LOG = $(OUTPUT)pmu-events/empty-pmu-events.log
+
+$(TEST_EMPTY_PMU_EVENTS_C): $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) none none $(OUTPUT)pmu-events/arch $@
 
@@ -112,36 +169,60 @@ $(EMPTY_PMU_EVENTS_TEST_LOG): $(EMPTY_PMU_EVENTS_C) $(TEST_EMPTY_PMU_EVENTS_C)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,test)diff -u $^ 2> $@ || (cat $@ && false)
 
+
+# Dependencies for jevents.py
+JEVENTS_DEPS := $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY) $(EMPTY_PMU_EVENTS_TEST_LOG) $(METRIC_TEST_LOG)
+
+# Rules to run mypy if enabled.
 ifdef MYPY
-  PMU_EVENTS_PY_TESTS := $(wildcard *.py)
-  PMU_EVENTS_MYPY_TEST_LOGS := $(JEVENTS_PY_TESTS:%=%.mypy_log)
-else
-  PMU_EVENTS_MYPY_TEST_LOGS :=
+define MYPY_RULE
+$(2): $(1)
+	$$(Q)$$(call echo-cmd,test)mypy $(1) > $(2) || (cat $(2) && rm $(2) && false)
+endef
+$(foreach src,$(wildcard pmu-events/*.py), \
+    $(eval dest := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.mypy_log,$(src))) \
+    $(eval $(call MYPY_RULE,$(src),$(dest))) \
+)
+
+MYPY_INPUTS := $(wildcard pmu-events/*.py)
+MYPY_OUTPUTS := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.mypy_log,$(MYPY_INPUTS))
+JEVENTS_DEPS += $(MYPY_OUTPUTS)
 endif
 
-$(OUTPUT)%.mypy_log: %
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,test)mypy "$<" > $@ || (cat $@ && rm $@ && false)
-
+# Rules to run pylint if enabled.
 ifdef PYLINT
-  PMU_EVENTS_PY_TESTS := $(wildcard *.py)
-  PMU_EVENTS_PYLINT_TEST_LOGS := $(JEVENTS_PY_TESTS:%=%.pylint_log)
-else
-  PMU_EVENTS_PYLINT_TEST_LOGS :=
+define PYLINT_RULE
+$(2): $(1)
+	$$(Q)$$(call echo-cmd,test)pylint $(1) > $(2) || (cat $(2) && rm $(2) && false)
+endef
+$(foreach src,$(wildcard pmu-events/*.py), \
+    $(eval dest := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.pylint_log,$(src))) \
+    $(eval $(call PYLINT_RULE,$(src),$(dest))) \
+)
+
+PYLINT_INPUTS := $(wildcard pmu-events/*.py)
+PYLINT_OUTPUTS := $(patsubst pmu-events/%,$(OUTPUT)pmu-events/%.pylint_log,$(PYLINT_INPUTS))
+JEVENTS_DEPS += $(PYLINT_OUTPUTS)
 endif
 
-$(OUTPUT)%.pylint_log: %
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,test)pylint "$<" > $@ || (cat $@ && rm $@ && false)
+# If there are orphaned files remove them.
+ifneq ($(strip $(ORPHAN_FILES)),)
+.PHONY: prune_orphans
 
-$(PMU_EVENTS_C): $(GEN_JSON) $(JSON_TEST) $(JEVENTS_PY) $(METRIC_PY) $(METRIC_TEST_LOG) \
-    $(EMPTY_PMU_EVENTS_TEST_LOG) $(PMU_EVENTS_MYPY_TEST_LOGS) $(PMU_EVENTS_PYLINT_TEST_LOGS)
-	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) $(JEVENTS_ARCH) $(JEVENTS_MODEL) $(OUTPUT)pmu-events/arch $@
+# Message for $(call echo-cmd,rm). Generally cleaning files isn't part
+# of a build step.
+quiet_cmd_rm  = RM      $^
+
+prune_orphans: $(ORPHAN_FILES)
+	$(Q)$(call echo-cmd,rm)rm -f $^
+
+JEVENTS_DEPS += prune_orphans
 endif
 
-# pmu-events.c file is generated in the OUTPUT directory so it needs a
-# separate rule to depend on it properly
-$(OUTPUT)pmu-events/pmu-events.o: $(PMU_EVENTS_C)
+# Finally, the rule to build pmu-events.c using jevents.py. All test
+# and inputs are dependencies.
+$(PMU_EVENTS_C): $(JEVENTS_DEPS)
 	$(call rule_mkdir)
-	$(call if_changed_dep,cc_o_c)
+	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) $(JEVENTS_ARCH) $(JEVENTS_MODEL) $(OUT_DIR) $@
+
+endif # ifeq ($(NO_JEVENTS),1)
-- 
2.53.0.rc1.225.gd81095ad13-goog