Skip to content

Commit ab38e84

Browse files
blakej11namhyung
authored andcommitted
perf record: collect BPF metadata from existing BPF programs
Look for .rodata maps, find ones with 'bpf_metadata_' variables, extract their values as strings, and create a new PERF_RECORD_BPF_METADATA synthetic event using that data. The code gets invoked from the existing routine perf_event__synthesize_one_bpf_prog(). For example, a BPF program with the following variables: const char bpf_metadata_version[] SEC(".rodata") = "3.14159"; int bpf_metadata_value[] SEC(".rodata") = 42; would generate a PERF_RECORD_BPF_METADATA record with: .prog_name = <BPF program name, e.g. "bpf_prog_a1b2c3_foo"> .nr_entries = 2 .entries[0].key = "version" .entries[0].value = "3.14159" .entries[1].key = "value" .entries[1].value = "42" Each of the BPF programs and subprograms that share those variables would get a distinct PERF_RECORD_BPF_METADATA record, with the ".prog_name" showing the name of each program or subprogram. The prog_name is deliberately the same as the ".name" field in the corresponding PERF_RECORD_KSYMBOL record. This code only gets invoked if support for displaying BTF char arrays as strings is detected. Signed-off-by: Blake Jones <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Namhyung Kim <[email protected]>
1 parent 1d0654b commit ab38e84

File tree

3 files changed

+362
-0
lines changed

3 files changed

+362
-0
lines changed

tools/lib/perf/include/perf/event.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,22 @@ struct perf_record_compressed2 {
467467
char data[];
468468
};
469469

470+
#define BPF_METADATA_KEY_LEN 64
471+
#define BPF_METADATA_VALUE_LEN 256
472+
#define BPF_PROG_NAME_LEN KSYM_NAME_LEN
473+
474+
struct perf_record_bpf_metadata_entry {
475+
char key[BPF_METADATA_KEY_LEN];
476+
char value[BPF_METADATA_VALUE_LEN];
477+
};
478+
479+
struct perf_record_bpf_metadata {
480+
struct perf_event_header header;
481+
char prog_name[BPF_PROG_NAME_LEN];
482+
__u64 nr_entries;
483+
struct perf_record_bpf_metadata_entry entries[];
484+
};
485+
470486
enum perf_user_event_type { /* above any possible kernel type */
471487
PERF_RECORD_USER_TYPE_START = 64,
472488
PERF_RECORD_HEADER_ATTR = 64,
@@ -489,6 +505,7 @@ enum perf_user_event_type { /* above any possible kernel type */
489505
PERF_RECORD_COMPRESSED = 81,
490506
PERF_RECORD_FINISHED_INIT = 82,
491507
PERF_RECORD_COMPRESSED2 = 83,
508+
PERF_RECORD_BPF_METADATA = 84,
492509
PERF_RECORD_HEADER_MAX
493510
};
494511

@@ -530,6 +547,7 @@ union perf_event {
530547
struct perf_record_header_feature feat;
531548
struct perf_record_compressed pack;
532549
struct perf_record_compressed2 pack2;
550+
struct perf_record_bpf_metadata bpf_metadata;
533551
};
534552

535553
#endif /* __LIBPERF_EVENT_H */

0 commit comments

Comments
 (0)