Commit f19860ea authored by Blake Jones's avatar Blake Jones Committed by Namhyung Kim
Browse files

perf tools: display the new PERF_RECORD_BPF_METADATA event



Here's some example "perf script -D" output for the new event type. The
": unhandled!" message is from tool.c, analogous to other behavior there.
I've elided some rows with all NUL characters for brevity, and I wrapped
one of the >75-column lines to fit in the commit guidelines.

0x50fc8@perf.data [0x260]: event: 84
.
. ... raw event: size 608 bytes
.  0000:  54 00 00 00 00 00 60 02 62 70 66 5f 70 72 6f 67  T.....`.bpf_prog
.  0010:  5f 31 65 30 61 32 65 33 36 36 65 35 36 66 31 61  _1e0a2e366e56f1a
.  0020:  32 5f 70 65 72 66 5f 73 61 6d 70 6c 65 5f 66 69  2_perf_sample_fi
.  0030:  6c 74 65 72 00 00 00 00 00 00 00 00 00 00 00 00  lter............
.  0040:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[...]
.  0110:  74 65 73 74 5f 76 61 6c 75 65 00 00 00 00 00 00  test_value......
.  0120:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[...]
.  0150:  34 32 00 00 00 00 00 00 00 00 00 00 00 00 00 00  42..............
.  0160:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
[...]

0 0x50fc8 [0x260]: PERF_RECORD_BPF_METADATA \
      prog bpf_prog_1e0a2e366e56f1a2_perf_sample_filter
  entry 0:           test_value = 42
: unhandled!

Signed-off-by: default avatarBlake Jones <blakejones@google.com>
Link: https://lore.kernel.org/r/20250612194939.162730-5-blakejones@google.com


Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent fdc3441f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2530,6 +2530,7 @@ int cmd_inject(int argc, const char **argv)
	inject.tool.finished_init	= perf_event__repipe_op2_synth;
	inject.tool.compressed		= perf_event__repipe_op4_synth;
	inject.tool.auxtrace		= perf_event__repipe_auxtrace;
	inject.tool.bpf_metadata	= perf_event__repipe_op2_synth;
	inject.tool.dont_split_sample_group = true;
	inject.session = __perf_session__new(&data, &inject.tool,
					     /*trace_event_repipe=*/inject.output.is_pipe);
+13 −2
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
#include "print_insn.h"
#include "archinsn.h"
#include <linux/bitmap.h>
#include <linux/compiler.h>
#include <linux/kernel.h>
#include <linux/stringify.h>
#include <linux/time64.h>
@@ -50,6 +51,7 @@
#include <errno.h>
#include <inttypes.h>
#include <signal.h>
#include <stdio.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
@@ -2755,6 +2757,14 @@ process_bpf_events(const struct perf_tool *tool __maybe_unused,
			   sample->tid);
}

static int
process_bpf_metadata_event(struct perf_session *session __maybe_unused,
			   union perf_event *event)
{
	perf_event__fprintf(event, NULL, stdout);
	return 0;
}

static int process_text_poke_events(const struct perf_tool *tool,
				    union perf_event *event,
				    struct perf_sample *sample,
@@ -2879,6 +2889,7 @@ static int __cmd_script(struct perf_script *script)
	if (script->show_bpf_events) {
		script->tool.ksymbol	  = process_bpf_events;
		script->tool.bpf	  = process_bpf_events;
		script->tool.bpf_metadata = process_bpf_metadata_event;
	}
	if (script->show_text_poke_events) {
		script->tool.ksymbol   = process_bpf_events;
+21 −0
Original line number Diff line number Diff line
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <linux/compiler.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <perf/cpumap.h>
#include <perf/event.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
@@ -78,6 +81,7 @@ static const char *perf_event__names[] = {
	[PERF_RECORD_COMPRESSED]		= "COMPRESSED",
	[PERF_RECORD_FINISHED_INIT]		= "FINISHED_INIT",
	[PERF_RECORD_COMPRESSED2]		= "COMPRESSED2",
	[PERF_RECORD_BPF_METADATA]		= "BPF_METADATA",
};

const char *perf_event__name(unsigned int id)
@@ -505,6 +509,20 @@ size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp)
		       event->bpf.type, event->bpf.flags, event->bpf.id);
}

size_t perf_event__fprintf_bpf_metadata(union perf_event *event, FILE *fp)
{
	struct perf_record_bpf_metadata *metadata = &event->bpf_metadata;
	size_t ret;

	ret = fprintf(fp, " prog %s\n", metadata->prog_name);
	for (__u32 i = 0; i < metadata->nr_entries; i++) {
		ret += fprintf(fp, "  entry %d: %20s = %s\n", i,
			       metadata->entries[i].key,
			       metadata->entries[i].value);
	}
	return ret;
}

static int text_poke_printer(enum binary_printer_ops op, unsigned int val,
			     void *extra, FILE *fp)
{
@@ -602,6 +620,9 @@ size_t perf_event__fprintf(union perf_event *event, struct machine *machine, FIL
	case PERF_RECORD_AUX_OUTPUT_HW_ID:
		ret += perf_event__fprintf_aux_output_hw_id(event, fp);
		break;
	case PERF_RECORD_BPF_METADATA:
		ret += perf_event__fprintf_bpf_metadata(event, fp);
		break;
	default:
		ret += fprintf(fp, "\n");
	}
+1 −0
Original line number Diff line number Diff line
@@ -370,6 +370,7 @@ size_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_cgroup(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_bpf_metadata(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_text_poke(union perf_event *event, struct machine *machine,FILE *fp);
size_t perf_event__fprintf(union perf_event *event, struct machine *machine, FILE *fp);

+4 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
#include <sys/types.h>
#include <sys/mman.h>
#include <perf/cpumap.h>
#include <perf/event.h>

#include "map_symbol.h"
#include "branch.h"
@@ -1491,6 +1492,9 @@ static s64 perf_session__process_user_event(struct perf_session *session,
	case PERF_RECORD_FINISHED_INIT:
		err = tool->finished_init(session, event);
		break;
	case PERF_RECORD_BPF_METADATA:
		err = tool->bpf_metadata(session, event);
		break;
	default:
		err = -EINVAL;
		break;
Loading