mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-15 00:22:13 -05:00
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: Blake Jones <blakejones@google.com> Link: https://lore.kernel.org/r/20250612194939.162730-5-blakejones@google.com Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
committed by
Namhyung Kim
parent
fdc3441f2d
commit
f19860ea94
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
@@ -2877,8 +2887,9 @@ static int __cmd_script(struct perf_script *script)
|
||||
script->tool.finished_round = process_finished_round_event;
|
||||
}
|
||||
if (script->show_bpf_events) {
|
||||
script->tool.ksymbol = process_bpf_events;
|
||||
script->tool.bpf = process_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;
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
#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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include "data.h"
|
||||
#include "debug.h"
|
||||
#include "event.h"
|
||||
#include "header.h"
|
||||
#include "session.h"
|
||||
#include "stat.h"
|
||||
#include "tool.h"
|
||||
#include "tsc.h"
|
||||
#include <linux/compiler.h>
|
||||
#include <sys/mman.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef HAVE_ZSTD_SUPPORT
|
||||
@@ -237,6 +240,16 @@ static int perf_session__process_compressed_event_stub(struct perf_session *sess
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int perf_event__process_bpf_metadata_stub(struct perf_session *perf_session __maybe_unused,
|
||||
union perf_event *event)
|
||||
{
|
||||
if (dump_trace)
|
||||
perf_event__fprintf_bpf_metadata(event, stdout);
|
||||
|
||||
dump_printf(": unhandled!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
void perf_tool__init(struct perf_tool *tool, bool ordered_events)
|
||||
{
|
||||
tool->ordered_events = ordered_events;
|
||||
@@ -293,6 +306,7 @@ void perf_tool__init(struct perf_tool *tool, bool ordered_events)
|
||||
tool->compressed = perf_session__process_compressed_event_stub;
|
||||
#endif
|
||||
tool->finished_init = process_event_op2_stub;
|
||||
tool->bpf_metadata = perf_event__process_bpf_metadata_stub;
|
||||
}
|
||||
|
||||
bool perf_tool__compressed_is_stub(const struct perf_tool *tool)
|
||||
|
||||
@@ -77,7 +77,8 @@ struct perf_tool {
|
||||
stat,
|
||||
stat_round,
|
||||
feature,
|
||||
finished_init;
|
||||
finished_init,
|
||||
bpf_metadata;
|
||||
event_op4 compressed;
|
||||
event_op3 auxtrace;
|
||||
bool ordered_events;
|
||||
|
||||
Reference in New Issue
Block a user