[PATCH v14 04/32] perf trace: Don't pass evsel with sample
From: Ian Rogers
Date: Wed May 20 2026 - 15:18:44 EST
As struct perf_sample now directly contains its own resolved evsel pointer,
passing the evsel separately is redundant and clutters the interface.
Remove the redundant evsel parameter from trace-specific handlers and
structures, ensuring the tool always directly accesses the evsel bound to the
sample. This simplifies the API signatures and eliminates the risk of passing
an inconsistent evsel.
Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
Acked-by: Namhyung Kim <namhyung@xxxxxxxxxx>
---
tools/perf/builtin-trace.c | 55 +++++++++++++++++++-------------------
1 file changed, 28 insertions(+), 27 deletions(-)
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index e8aabd7a72fe..eca578212def 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -536,12 +536,12 @@ static struct evsel *perf_evsel__raw_syscall_newtp(const char *direction, void *
return NULL;
}
-#define perf_evsel__sc_tp_uint(evsel, name, sample) \
- ({ struct syscall_tp *fields = __evsel__syscall_tp(evsel); \
+#define perf_evsel__sc_tp_uint(name, sample) \
+ ({ struct syscall_tp *fields = __evsel__syscall_tp(sample->evsel); \
fields->name.integer(&fields->name, sample); })
-#define perf_evsel__sc_tp_ptr(evsel, name, sample) \
- ({ struct syscall_tp *fields = __evsel__syscall_tp(evsel); \
+#define perf_evsel__sc_tp_ptr(name, sample) \
+ ({ struct syscall_tp *fields = __evsel__syscall_tp(sample->evsel); \
fields->name.pointer(&fields->name, sample); })
size_t strarray__scnprintf_suffix(struct strarray *sa, char *bf, size_t size, const char *intfmt, bool show_suffix, int val)
@@ -2749,8 +2749,8 @@ static int trace__printf_interrupted_entry(struct trace *trace)
return printed;
}
-static int trace__fprintf_sample(struct trace *trace, struct evsel *evsel,
- struct perf_sample *sample, struct thread *thread)
+static int trace__fprintf_sample(struct trace *trace, struct perf_sample *sample,
+ struct thread *thread)
{
int printed = 0;
@@ -2758,7 +2758,7 @@ static int trace__fprintf_sample(struct trace *trace, struct evsel *evsel,
double ts = (double)sample->time / NSEC_PER_MSEC;
printed += fprintf(trace->output, "%22s %10.3f %s %d/%d [%d]\n",
- evsel__name(evsel), ts,
+ evsel__name(sample->evsel), ts,
thread__comm_str(thread),
sample->pid, sample->tid, sample->cpu);
}
@@ -2813,7 +2813,7 @@ static int trace__sys_enter(struct trace *trace, struct evsel *evsel,
void *args;
int printed = 0;
struct thread *thread;
- int id = perf_evsel__sc_tp_uint(evsel, id, sample), err = -1;
+ int id = perf_evsel__sc_tp_uint(id, sample), err = -1;
int augmented_args_size = 0, e_machine;
void *augmented_args = NULL;
struct syscall *sc;
@@ -2828,9 +2828,9 @@ static int trace__sys_enter(struct trace *trace, struct evsel *evsel,
if (ttrace == NULL)
goto out_put;
- trace__fprintf_sample(trace, evsel, sample, thread);
+ trace__fprintf_sample(trace, sample, thread);
- args = perf_evsel__sc_tp_ptr(evsel, args, sample);
+ args = perf_evsel__sc_tp_ptr(args, sample);
if (ttrace->entry_str == NULL) {
ttrace->entry_str = malloc(trace__entry_str_size);
@@ -2888,12 +2888,11 @@ static int trace__sys_enter(struct trace *trace, struct evsel *evsel,
return err;
}
-static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel,
- struct perf_sample *sample)
+static int trace__fprintf_sys_enter(struct trace *trace, struct perf_sample *sample)
{
struct thread_trace *ttrace;
struct thread *thread;
- int id = perf_evsel__sc_tp_uint(evsel, id, sample), err = -1;
+ int id = perf_evsel__sc_tp_uint(id, sample), err = -1;
struct syscall *sc;
char msg[1024];
void *args, *augmented_args = NULL;
@@ -2903,7 +2902,7 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel,
thread = machine__findnew_thread(trace->host, sample->pid, sample->tid);
e_machine = thread__e_machine(thread, trace->host, /*e_flags=*/NULL);
- sc = trace__syscall_info(trace, evsel, e_machine, id);
+ sc = trace__syscall_info(trace, sample->evsel, e_machine, id);
if (sc == NULL)
goto out_put;
ttrace = thread__trace(thread, trace);
@@ -2914,7 +2913,7 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel,
if (ttrace == NULL)
goto out_put;
- args = perf_evsel__sc_tp_ptr(evsel, args, sample);
+ args = perf_evsel__sc_tp_ptr(args, sample);
augmented_args = syscall__augmented_args(sc, sample, &augmented_args_size, trace->raw_augmented_syscalls_args_size);
printed += syscall__scnprintf_args(sc, msg, sizeof(msg), args, augmented_args, augmented_args_size, trace, thread);
fprintf(trace->output, "%.*s", (int)printed, msg);
@@ -2924,10 +2923,11 @@ static int trace__fprintf_sys_enter(struct trace *trace, struct evsel *evsel,
return err;
}
-static int trace__resolve_callchain(struct trace *trace, struct evsel *evsel,
+static int trace__resolve_callchain(struct trace *trace,
struct perf_sample *sample,
struct callchain_cursor *cursor)
{
+ struct evsel *evsel = sample->evsel;
struct addr_location al;
int max_stack = evsel->core.attr.sample_max_stack ?
evsel->core.attr.sample_max_stack :
@@ -2962,7 +2962,7 @@ static int trace__sys_exit(struct trace *trace, struct evsel *evsel,
u64 duration = 0;
bool duration_calculated = false;
struct thread *thread;
- int id = perf_evsel__sc_tp_uint(evsel, id, sample), err = -1, callchain_ret = 0, printed = 0;
+ int id = perf_evsel__sc_tp_uint(id, sample), err = -1, callchain_ret = 0, printed = 0;
int alignment = trace->args_alignment, e_machine;
struct syscall *sc;
struct thread_trace *ttrace;
@@ -2976,9 +2976,9 @@ static int trace__sys_exit(struct trace *trace, struct evsel *evsel,
if (ttrace == NULL)
goto out_put;
- trace__fprintf_sample(trace, evsel, sample, thread);
+ trace__fprintf_sample(trace, sample, thread);
- ret = perf_evsel__sc_tp_uint(evsel, ret, sample);
+ ret = perf_evsel__sc_tp_uint(ret, sample);
if (trace->summary)
thread__update_stats(thread, ttrace, id, sample, ret, trace);
@@ -3000,7 +3000,7 @@ static int trace__sys_exit(struct trace *trace, struct evsel *evsel,
if (sample->callchain) {
struct callchain_cursor *cursor = get_tls_callchain_cursor();
- callchain_ret = trace__resolve_callchain(trace, evsel, sample, cursor);
+ callchain_ret = trace__resolve_callchain(trace, sample, cursor);
if (callchain_ret == 0) {
if (cursor->nr < trace->min_stack)
goto out;
@@ -3217,9 +3217,10 @@ static void bpf_output__fprintf(struct trace *trace,
++trace->nr_events_printed;
}
-static size_t trace__fprintf_tp_fields(struct trace *trace, struct evsel *evsel, struct perf_sample *sample,
+static size_t trace__fprintf_tp_fields(struct trace *trace, struct perf_sample *sample,
struct thread *thread, void *augmented_args, int augmented_args_size)
{
+ struct evsel *evsel = sample->evsel;
char bf[2048];
size_t size = sizeof(bf);
const struct tep_event *tp_format = evsel__tp_format(evsel);
@@ -3302,7 +3303,7 @@ static int trace__event_handler(struct trace *trace, struct evsel *evsel,
if (sample->callchain) {
struct callchain_cursor *cursor = get_tls_callchain_cursor();
- callchain_ret = trace__resolve_callchain(trace, evsel, sample, cursor);
+ callchain_ret = trace__resolve_callchain(trace, sample, cursor);
if (callchain_ret == 0) {
if (cursor->nr < trace->min_stack)
goto out;
@@ -3323,7 +3324,7 @@ static int trace__event_handler(struct trace *trace, struct evsel *evsel,
trace__fprintf_comm_tid(trace, thread, trace->output);
if (evsel == trace->syscalls.events.bpf_output) {
- int id = perf_evsel__sc_tp_uint(evsel, id, sample);
+ int id = perf_evsel__sc_tp_uint(id, sample);
int e_machine = thread
? thread__e_machine(thread, trace->host, /*e_flags=*/NULL)
: EM_HOST;
@@ -3331,7 +3332,7 @@ static int trace__event_handler(struct trace *trace, struct evsel *evsel,
if (sc) {
fprintf(trace->output, "%s(", sc->name);
- trace__fprintf_sys_enter(trace, evsel, sample);
+ trace__fprintf_sys_enter(trace, sample);
fputc(')', trace->output);
goto newline;
}
@@ -3351,13 +3352,13 @@ static int trace__event_handler(struct trace *trace, struct evsel *evsel,
const struct tep_event *tp_format = evsel__tp_format(evsel);
if (tp_format && (strncmp(tp_format->name, "sys_enter_", 10) ||
- trace__fprintf_sys_enter(trace, evsel, sample))) {
+ trace__fprintf_sys_enter(trace, sample))) {
if (trace->libtraceevent_print) {
event_format__fprintf(tp_format, sample->cpu,
sample->raw_data, sample->raw_size,
trace->output);
} else {
- trace__fprintf_tp_fields(trace, evsel, sample, thread, NULL, 0);
+ trace__fprintf_tp_fields(trace, sample, thread, NULL, 0);
}
}
}
@@ -3416,7 +3417,7 @@ static int trace__pgfault(struct trace *trace,
if (sample->callchain) {
struct callchain_cursor *cursor = get_tls_callchain_cursor();
- callchain_ret = trace__resolve_callchain(trace, evsel, sample, cursor);
+ callchain_ret = trace__resolve_callchain(trace, sample, cursor);
if (callchain_ret == 0) {
if (cursor->nr < trace->min_stack)
goto out_put;
--
2.54.0.746.g67dd491aae-goog