mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ian Rogers <irogers@google.com>
To: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	 Arnaldo Carvalho de Melo <acme@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	 James Clark <james.clark@linaro.org>,
	Kan Liang <kan.liang@linux.intel.com>,
	 linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
	 Ian Rogers <irogers@google.com>
Subject: [PATCH 08/10] perf build: Enable jevents string compression when available
Date: Fri, 13 Nov 2026 13:08:20 -0800	[thread overview]
Message-ID: <20261113210822.3112700-9-irogers@google.com> (raw)
In-Reply-To: <20261113210822.3112700-1-irogers@google.com>

Pass --compress=<available> to jevents.py during regular builds to
enable block-indexed string compression (packing generated PMU event and
metric strings into independently compressed ~8 KiB blocks decompressed
on demand by (block_id << 16) | sub_offset), constructing the fallback
list from CONFIG_ZSTD, CONFIG_ZLIB, CONFIG_LZMA, and none so jevents.py
only emits decompression C code for libraries actually linked into perf
(e.g. falling back to zlib when built with NO_LIBZSTD=1, or uncompressed
strings when all three are disabled).

Expose JEVENTS_COMPRESS=<zstd|zlib|lzma|none> (or a comma-separated
preference list) in Makefile.perf to override or disable compression, and
track NO_JEVENTS, JEVENTS_ARCH, JEVENTS_MODEL, and the active compression
selection in $(OUTPUT)pmu-events/jevents-flags so changing build flags
triggers regeneration without rerunning jevents.py on incremental no-op
builds. Also cover JEVENTS_COMPRESS=none in tools/perf/tests/make.

Signed-off-by: Ian Rogers <irogers@google.com>
---
 tools/perf/.gitignore       |  1 +
 tools/perf/Makefile.perf    | 10 +++++++-
 tools/perf/pmu-events/Build | 47 ++++++++++++++++++++++++++++++++-----
 tools/perf/tests/make       |  2 ++
 4 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/tools/perf/.gitignore b/tools/perf/.gitignore
index 3b968c5158b8..faf88857abff 100644
--- a/tools/perf/.gitignore
+++ b/tools/perf/.gitignore
@@ -39,6 +39,7 @@ trace/beauty/generated/
 pmu-events/arch/common/common/legacy-cache.json
 pmu-events/pmu-events.c
 pmu-events/pmu-events-string.c
+pmu-events/jevents-flags
 pmu-events/jevents
 pmu-events/metric_test.log
 pmu-events/empty-pmu-events.log
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index b74b534e1153..53ab82681569 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -129,6 +129,12 @@ include ../scripts/utilities.mak
 # Define NO_MYPY if you do not want to run mypy during build
 #
 # Define NO_PYLINT if you do not want to run pylint during build
+#
+# Define JEVENTS_COMPRESS=<zstd|zlib|lzma|none> to select or disable
+# block-indexed compression of generated PMU event and metric strings, where
+# strings are packed into ~8 KiB blocks compressed independently and
+# decompressed on demand by (block_id << 16) | sub_offset (defaults to the best
+# enabled library among zstd, zlib, lzma, or none).
 
 # As per kernel Makefile, avoid funny character set dependencies
 unexport LC_ALL
@@ -593,7 +599,7 @@ strip: $(PROGRAMS) $(OUTPUT)perf
 
 PERF_IN := $(OUTPUT)perf-in.o
 
-export NO_JEVENTS
+export NO_JEVENTS JEVENTS_ARCH JEVENTS_MODEL JEVENTS_COMPRESS
 
 build := -f $(srctree)/tools/build/Makefile.build dir=. obj
 
@@ -1036,6 +1042,7 @@ pmu-events-clean:
 ifeq ($(OUTPUT),)
 	$(call QUIET_CLEAN, pmu-events) $(RM) \
 		pmu-events/pmu-events*.c \
+		pmu-events/jevents-flags \
 		pmu-events/metric_test.log \
 		pmu-events/test-empty-pmu-events.c \
 		pmu-events/empty-pmu-events.log
@@ -1044,6 +1051,7 @@ ifeq ($(OUTPUT),)
 else # When an OUTPUT directory is present, clean up the copied pmu-events/arch directory.
 	$(call QUIET_CLEAN, pmu-events) $(RM) -r $(OUTPUT)pmu-events/arch \
 		$(OUTPUT)pmu-events/pmu-events*.c \
+		$(OUTPUT)pmu-events/jevents-flags \
 		$(OUTPUT)pmu-events/metric_test.log \
 		$(OUTPUT)pmu-events/test-empty-pmu-events.c \
 		$(OUTPUT)pmu-events/empty-pmu-events.log
diff --git a/tools/perf/pmu-events/Build b/tools/perf/pmu-events/Build
index 5147139bbb6f..88b6b47951e0 100644
--- a/tools/perf/pmu-events/Build
+++ b/tools/perf/pmu-events/Build
@@ -22,19 +22,48 @@ $(OUTPUT)pmu-events/pmu-events-string.o: $(PMU_EVENTS_STRING_C)
 # the destination to save space in the build log.
 quiet_cmd_cp   = COPY    $(patsubst %$<,%,$@) <- $<
 
+JEVENTS_FLAGS_FILE := $(OUTPUT)pmu-events/jevents-flags
+
 # --- NO_JEVENTS=1 build ---
 ifeq ($(NO_JEVENTS),1)
-$(PMU_EVENTS_C): $(EMPTY_PMU_EVENTS_C)
+JEVENTS_FLAGS_STR := $(NO_JEVENTS)
+
+$(PMU_EVENTS_C): $(EMPTY_PMU_EVENTS_C) $(JEVENTS_FLAGS_FILE)
 	$(call rule_mkdir)
 	$(Q)$(call echo-cmd,cp)cp $< $@
 else
 # --- Regular build ---
 
-# Setup the JEVENTS_ARCH and JEVENTS_MODEL
+# Setup the JEVENTS_ARCH, JEVENTS_MODEL and JEVENTS_COMPRESS
 ifeq ($(JEVENTS_ARCH),)
 JEVENTS_ARCH=$(SRCARCH)
 endif
-JEVENTS_MODEL ?= all
+ifeq ($(JEVENTS_MODEL),)
+JEVENTS_MODEL=all
+endif
+
+JEVENTS_COMPRESS_AVAIL :=
+ifeq ($(CONFIG_ZSTD),y)
+JEVENTS_COMPRESS_AVAIL += zstd
+endif
+ifeq ($(CONFIG_ZLIB),y)
+JEVENTS_COMPRESS_AVAIL += zlib
+endif
+ifeq ($(CONFIG_LZMA),y)
+JEVENTS_COMPRESS_AVAIL += lzma
+endif
+JEVENTS_COMPRESS_AVAIL += none
+
+ifeq ($(JEVENTS_COMPRESS),)
+JEVENTS_COMPRESS := $(subst $(space),$(comma),$(strip $(JEVENTS_COMPRESS_AVAIL)))
+endif
+
+JEVENTS_COMPRESS_ACTIVE := $(filter $(JEVENTS_COMPRESS_AVAIL),$(subst $(comma),$(space),$(JEVENTS_COMPRESS)))
+ifeq ($(JEVENTS_COMPRESS_ACTIVE),)
+$(error JEVENTS_COMPRESS='$(JEVENTS_COMPRESS)' requires libraries not enabled in this build (available: $(strip $(JEVENTS_COMPRESS_AVAIL))))
+endif
+JEVENTS_COMPRESS_ARG := $(subst $(space),$(comma),$(strip $(JEVENTS_COMPRESS_ACTIVE)))
+JEVENTS_FLAGS_STR := $(NO_JEVENTS):$(JEVENTS_ARCH):$(JEVENTS_MODEL):$(JEVENTS_COMPRESS_ARG)
 
 # The input json/csv files
 SRC_DIR		:= pmu-events/arch
@@ -181,7 +210,7 @@ $(EMPTY_PMU_EVENTS_TEST_LOG): $(EMPTY_PMU_EVENTS_C) $(TEST_EMPTY_PMU_EVENTS_C)
 
 
 # Dependencies for jevents.py
-JEVENTS_DEPS := $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY) $(EMPTY_PMU_EVENTS_TEST_LOG) $(METRIC_TEST_LOG)
+JEVENTS_DEPS := $(OUT_JSON) $(GEN_JSON) $(JEVENTS_PY) $(METRIC_PY) $(EMPTY_PMU_EVENTS_TEST_LOG) $(METRIC_TEST_LOG) $(JEVENTS_FLAGS_FILE)
 
 # If there are orphaned files remove them.
 ifneq ($(strip $(ORPHAN_FILES)),)
@@ -204,14 +233,20 @@ endif
 # and inputs are dependencies.
 $(PMU_EVENTS_C): $(JEVENTS_DEPS)
 	$(call rule_mkdir)
-	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) $(JEVENTS_ARCH) $(JEVENTS_MODEL) \
-            $(OUT_DIR) $(PMU_EVENTS_C) $(PMU_EVENTS_STRING_C)
+	$(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) --compress=$(JEVENTS_COMPRESS_ARG) \
+            $(JEVENTS_ARCH) $(JEVENTS_MODEL) $(OUT_DIR) $(PMU_EVENTS_C) $(PMU_EVENTS_STRING_C)
 
 $(PMU_EVENTS_STRING_C): $(PMU_EVENTS_C)
 	@:
 
 endif # ifeq ($(NO_JEVENTS),1)
 
+$(JEVENTS_FLAGS_FILE): FORCE
+	$(call rule_mkdir)
+	@if [ "$$(cat $@ 2>/dev/null)" != "$(JEVENTS_FLAGS_STR)" ]; then \
+		printf '%s' "$(JEVENTS_FLAGS_STR)" > $@; \
+	fi
+
 ifneq ($(NO_JEVENTS),1)
   PY_TESTS := $(wildcard pmu-events/*.py)
 else
diff --git a/tools/perf/tests/make b/tools/perf/tests/make
index 7524de522802..5a04f67257ac 100644
--- a/tools/perf/tests/make
+++ b/tools/perf/tests/make
@@ -77,6 +77,7 @@ make_clang_nondistro := CC=clang BUILD_NONDISTRO=1
 make_extra_tests    := EXTRA_TESTS=1
 make_no_jevents     := NO_JEVENTS=1
 make_jevents_all    := JEVENTS_ARCH=all
+make_jevents_compress_none := JEVENTS_COMPRESS=none
 make_no_bpf_skel    := BUILD_BPF_SKEL=0
 make_gen_vmlinux_h  := GEN_VMLINUX_H=1
 make_no_python_module := NO_PYTHON_MODULE=1
@@ -172,6 +173,7 @@ endif
 run += make_extra_tests
 run += make_no_jevents
 run += make_jevents_all
+run += make_jevents_compress_none
 run += make_no_bpf_skel
 run += make_gen_vmlinux_h
 run += make_no_python_module
-- 
2.56.1.703.gf848ed807c-goog


  parent reply	other threads:[~2026-11-13 21:08 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-13 21:08 [PATCH 00/10] perf jevents: Block-indexed string compression and default JEVENTS_ARCH=all Ian Rogers
2026-11-13 21:08 ` [PATCH 01/10] perf jevents: Store raw bytes in BigCString instead of C-escaped strings Ian Rogers
2026-11-13 21:08 ` [PATCH 02/10] perf jevents: Sort BigCString entries alphabetically Ian Rogers
2026-11-13 21:08 ` [PATCH 03/10] perf jevents: Store PMU names as string literals in struct pmu_table_entry Ian Rogers
2026-11-13 21:08 ` [PATCH 04/10] perf jevents: Encapsulate big_c_string lookups behind pmu_events__get_string() Ian Rogers
2026-11-13 21:08 ` [PATCH 05/10] perf jevents: Add block-indexed string packing and --compress=zlib Ian Rogers
2026-11-13 21:08 ` [PATCH 06/10] perf jevents: Add --compress=lzma block compression backend Ian Rogers
2026-11-13 21:08 ` [PATCH 07/10] perf jevents: Add --compress=zstd " Ian Rogers
2026-11-13 21:08 ` Ian Rogers [this message]
2026-11-13 21:08 ` [PATCH 09/10] perf tests pmu-events: Test metricgroup descriptions and concurrent lookups Ian Rogers
2026-11-13 21:08 ` [PATCH 10/10] perf build: Default JEVENTS_ARCH to all Ian Rogers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261113210822.3112700-9-irogers@google.com \
    --to=irogers@google.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=james.clark@linaro.org \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®