[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250612194939.162730-1-blakejones@google.com>
Date: Thu, 12 Jun 2025 12:49:34 -0700
From: Blake Jones <blakejones@...gle.com>
To: Arnaldo Carvalho de Melo <acme@...nel.org>, Namhyung Kim <namhyung@...nel.org>,
Ian Rogers <irogers@...gle.com>, Jiri Olsa <jolsa@...nel.org>,
Peter Zijlstra <peterz@...radead.org>, Ingo Molnar <mingo@...hat.com>
Cc: Mark Rutland <mark.rutland@....com>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Adrian Hunter <adrian.hunter@...el.com>, Kan Liang <kan.liang@...ux.intel.com>,
Steven Rostedt <rostedt@...dmis.org>, Tomas Glozar <tglozar@...hat.com>,
James Clark <james.clark@...aro.org>, Leo Yan <leo.yan@....com>,
Guilherme Amadio <amadio@...too.org>, Yang Jihong <yangjihong@...edance.com>,
Charlie Jenkins <charlie@...osinc.com>, Chun-Tse Shao <ctshao@...gle.com>,
Aditya Gupta <adityag@...ux.ibm.com>, Athira Rajeev <atrajeev@...ux.vnet.ibm.com>,
Zhongqiu Han <quic_zhonhan@...cinc.com>, Andi Kleen <ak@...ux.intel.com>,
Dmitry Vyukov <dvyukov@...gle.com>, Yujie Liu <yujie.liu@...el.com>,
Graham Woodward <graham.woodward@....com>, Yicong Yang <yangyicong@...ilicon.com>,
Ben Gainey <ben.gainey@....com>, linux-kernel@...r.kernel.org,
linux-perf-users@...r.kernel.org, bpf@...r.kernel.org,
Blake Jones <blakejones@...gle.com>
Subject: [PATCH v4 0/5] perf: generate events for BPF metadata
Commit ffa915f46193 ("Merge branch 'bpf_metadata'"), from September 2020,
added support to the kernel, libbpf, and bpftool to treat read-only BPF
variables that have names starting with 'bpf_metadata_' specially. This
patch series updates perf to handle these variables similarly, allowing a
perf.data file to capture relevant information about BPF programs on the
system being profiled.
When it encounters a BPF program, it reads the program's maps to find an
'.rodata' map with 'bpf_metadata_' variables. If it finds one, it extracts
their values as strings, and creates a new PERF_RECORD_BPF_METADATA
synthetic event using that data. It does this both for BPF programs that
were loaded when a 'perf record' starts, as well as for programs that are
loaded while the profile is running. For the latter case, it stores the
metadata for the duration of the profile, and then dumps it at the end of
the profile, where it's in a better context to do so.
The PERF_RECORD_BPF_METADATA event holds an array of key-value pairs, where
the key is the variable name (minus the "bpf_metadata_" prefix) and the
value is the variable's value, formatted as a string. There is one such
event generated for each BPF subprogram. Generating it per subprogram
rather than per program allows it to be correlated with PERF_RECORD_KSYMBOL
events; the metadata event's "prog_name" is designed to be identical to the
"name" field of a perf_record_ksymbol. This allows specific BPF metadata to
be associated with each BPF address range in the collection.
Changes:
* v3 -> v4:
- Fix LIBBPF_INCLUDE in tools/perf/Makefile.config to use the libbpf
source path, since libbpf/include doesn't exist during feature testing.
- Fix the bpf_metadata_free() declaration for HAVE_LIBBPF_SUPPORT=0.
- Add HAVE_LIBBPF_SUPPORT around some declarations in util/env.h,
to align with the guards in util/env.c.
- Add HAVE_LIBBPF_SUPPORT around a function call in builtin-record.c.
- Link to v3:
https://lore.kernel.org/linux-perf-users/20250606215246.2419387-1-blakejones@google.com/T/#t
* v2 -> v3:
- Split out event collection from event display.
- Resync with tmp.perf-tools-next.
- Link to v2:
https://lore.kernel.org/linux-perf-users/20250605233934.1881839-1-blakejones@google.com/T/#t
* v1 -> v2:
- Split out libbpf change and send it to the bpf tree.
- Add feature detection to perf to detect the libbpf change.
- Allow the feature to be skipped if the libbpf support is not found.
- Add an example of a PERF_RECORD_BPF_METADATA record.
- Change calloc() calls to zalloc().
- Don't check for NULL before calling free().
- Update the perf_event header when it is created, rather than
storing the event size and updating it later.
- Add a BPF metadata variable (with the perf version) to all
perf BPF programs.
- Update the selftest to look for the new perf_version variable.
- Split out the selftest into its own patch.
- Link to v1:
https://lore.kernel.org/linux-perf-users/20250521222725.3895192-1-blakejones@google.com/T/#t
Blake Jones (5):
perf: detect support for libbpf's emit_strings option
perf: collect BPF metadata from existing BPF programs
perf: collect BPF metadata from new programs
perf: display the new PERF_RECORD_BPF_METADATA event
perf: add test for PERF_RECORD_BPF_METADATA collection
tools/build/Makefile.feature | 1 +
tools/build/feature/Makefile | 4 +
tools/build/feature/test-libbpf-strings.c | 10 +
tools/lib/perf/include/perf/event.h | 18 +
tools/perf/Documentation/perf-check.txt | 1 +
tools/perf/Makefile.config | 8 +
tools/perf/Makefile.perf | 3 +-
tools/perf/builtin-check.c | 1 +
tools/perf/builtin-inject.c | 1 +
tools/perf/builtin-record.c | 10 +
tools/perf/builtin-script.c | 15 +-
tools/perf/tests/shell/test_bpf_metadata.sh | 76 ++++
tools/perf/util/bpf-event.c | 378 ++++++++++++++++++++
tools/perf/util/bpf-event.h | 13 +
tools/perf/util/bpf_skel/perf_version.h | 17 +
tools/perf/util/env.c | 19 +-
tools/perf/util/env.h | 6 +
tools/perf/util/event.c | 21 ++
tools/perf/util/event.h | 1 +
tools/perf/util/header.c | 1 +
tools/perf/util/session.c | 4 +
tools/perf/util/synthetic-events.h | 2 +
tools/perf/util/tool.c | 14 +
tools/perf/util/tool.h | 3 +-
24 files changed, 622 insertions(+), 5 deletions(-)
create mode 100644 tools/build/feature/test-libbpf-strings.c
create mode 100755 tools/perf/tests/shell/test_bpf_metadata.sh
create mode 100644 tools/perf/util/bpf_skel/perf_version.h
--
2.50.0.rc1.591.g9c95f17f64-goog
Powered by blists - more mailing lists