[PATCH v14 15/32] perf sched: Don't pass evsel with sample
From: Ian Rogers
Date: Wed May 20 2026 - 15:24:48 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 sched-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-sched.c | 92 ++++++++++++++------------------------
1 file changed, 34 insertions(+), 58 deletions(-)
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 2a971081918b..d984e58c7dbf 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -129,21 +129,20 @@ typedef int (*sort_fn_t)(struct work_atoms *, struct work_atoms *);
struct perf_sched;
struct trace_sched_handler {
- int (*switch_event)(struct perf_sched *sched, struct evsel *evsel,
- struct perf_sample *sample, struct machine *machine);
+ int (*switch_event)(struct perf_sched *sched, struct perf_sample *sample,
+ struct machine *machine);
- int (*runtime_event)(struct perf_sched *sched, struct evsel *evsel,
- struct perf_sample *sample, struct machine *machine);
+ int (*runtime_event)(struct perf_sched *sched, struct perf_sample *sample,
+ struct machine *machine);
- int (*wakeup_event)(struct perf_sched *sched, struct evsel *evsel,
- struct perf_sample *sample, struct machine *machine);
+ int (*wakeup_event)(struct perf_sched *sched, struct perf_sample *sample,
+ struct machine *machine);
/* PERF_RECORD_FORK event, not sched_process_fork tracepoint */
int (*fork_event)(struct perf_sched *sched, union perf_event *event,
struct machine *machine);
int (*migrate_task_event)(struct perf_sched *sched,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine);
};
@@ -826,7 +825,7 @@ static void test_calibrations(struct perf_sched *sched)
static int
replay_wakeup_event(struct perf_sched *sched,
- struct evsel *evsel, struct perf_sample *sample,
+ struct perf_sample *sample,
struct machine *machine __maybe_unused)
{
const char *comm = perf_sample__strval(sample, "comm");
@@ -834,7 +833,7 @@ replay_wakeup_event(struct perf_sched *sched,
struct task_desc *waker, *wakee;
if (verbose > 0) {
- printf("sched_wakeup event %p\n", evsel);
+ printf("sched_wakeup event %p\n", sample->evsel);
printf(" ... pid %d woke up %s/%d\n", sample->tid, comm, pid);
}
@@ -847,7 +846,6 @@ replay_wakeup_event(struct perf_sched *sched,
}
static int replay_switch_event(struct perf_sched *sched,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine __maybe_unused)
{
@@ -861,7 +859,7 @@ static int replay_switch_event(struct perf_sched *sched,
s64 delta;
if (verbose > 0)
- printf("sched_switch event %p\n", evsel);
+ printf("sched_switch event %p\n", sample->evsel);
if (cpu >= MAX_CPUS || cpu < 0)
return 0;
@@ -1134,7 +1132,6 @@ static void free_work_atoms(struct work_atoms *atoms)
}
static int latency_switch_event(struct perf_sched *sched,
- struct evsel *evsel __maybe_unused,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1204,7 +1201,6 @@ static int latency_switch_event(struct perf_sched *sched,
}
static int latency_runtime_event(struct perf_sched *sched,
- struct evsel *evsel __maybe_unused,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1239,7 +1235,6 @@ static int latency_runtime_event(struct perf_sched *sched,
}
static int latency_wakeup_event(struct perf_sched *sched,
- struct evsel *evsel __maybe_unused,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1300,7 +1295,6 @@ static int latency_wakeup_event(struct perf_sched *sched,
}
static int latency_migrate_task_event(struct perf_sched *sched,
- struct evsel *evsel __maybe_unused,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1519,20 +1513,18 @@ static void perf_sched__sort_lat(struct perf_sched *sched)
}
static int process_sched_wakeup_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
struct perf_sched *sched = container_of(tool, struct perf_sched, tool);
if (sched->tp_handler->wakeup_event)
- return sched->tp_handler->wakeup_event(sched, evsel, sample, machine);
+ return sched->tp_handler->wakeup_event(sched, sample, machine);
return 0;
}
static int process_sched_wakeup_ignore(const struct perf_tool *tool __maybe_unused,
- struct evsel *evsel __maybe_unused,
struct perf_sample *sample __maybe_unused,
struct machine *machine __maybe_unused)
{
@@ -1626,8 +1618,8 @@ static void print_sched_map(struct perf_sched *sched, struct perf_cpu this_cpu,
}
}
-static int map_switch_event(struct perf_sched *sched, struct evsel *evsel __maybe_unused,
- struct perf_sample *sample, struct machine *machine)
+static int map_switch_event(struct perf_sched *sched, struct perf_sample *sample,
+ struct machine *machine)
{
const u32 next_pid = perf_sample__intval(sample, "next_pid");
const u32 prev_pid = perf_sample__intval(sample, "prev_pid");
@@ -1791,7 +1783,6 @@ static int map_switch_event(struct perf_sched *sched, struct evsel *evsel __mayb
}
static int process_sched_switch_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1810,21 +1801,20 @@ static int process_sched_switch_event(const struct perf_tool *tool,
}
if (sched->tp_handler->switch_event)
- err = sched->tp_handler->switch_event(sched, evsel, sample, machine);
+ err = sched->tp_handler->switch_event(sched, sample, machine);
sched->curr_pid[this_cpu] = next_pid;
return err;
}
static int process_sched_runtime_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
struct perf_sched *sched = container_of(tool, struct perf_sched, tool);
if (sched->tp_handler->runtime_event)
- return sched->tp_handler->runtime_event(sched, evsel, sample, machine);
+ return sched->tp_handler->runtime_event(sched, sample, machine);
return 0;
}
@@ -1847,20 +1837,18 @@ static int perf_sched__process_fork_event(const struct perf_tool *tool,
}
static int process_sched_migrate_task_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
struct perf_sched *sched = container_of(tool, struct perf_sched, tool);
if (sched->tp_handler->migrate_task_event)
- return sched->tp_handler->migrate_task_event(sched, evsel, sample, machine);
+ return sched->tp_handler->migrate_task_event(sched, sample, machine);
return 0;
}
typedef int (*tracepoint_handler)(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine);
@@ -1874,7 +1862,7 @@ static int perf_sched__process_tracepoint_sample(const struct perf_tool *tool __
if (evsel->handler != NULL) {
tracepoint_handler f = evsel->handler;
- err = f(tool, evsel, sample, machine);
+ err = f(tool, sample, machine);
}
return err;
@@ -2313,11 +2301,10 @@ static void timehist_update_runtime_stats(struct thread_runtime *r,
r->total_pre_mig_time += r->dt_pre_mig;
}
-static bool is_idle_sample(struct perf_sample *sample,
- struct evsel *evsel)
+static bool is_idle_sample(struct perf_sample *sample)
{
/* pid 0 == swapper == idle task */
- if (evsel__name_is(evsel, "sched:sched_switch"))
+ if (evsel__name_is(sample->evsel, "sched:sched_switch"))
return perf_sample__intval(sample, "prev_pid") == 0;
return sample->pid == 0;
@@ -2499,12 +2486,11 @@ static void save_idle_callchain(struct perf_sched *sched,
static struct thread *timehist_get_thread(struct perf_sched *sched,
struct perf_sample *sample,
- struct machine *machine,
- struct evsel *evsel)
+ struct machine *machine)
{
struct thread *thread;
- if (is_idle_sample(sample, evsel)) {
+ if (is_idle_sample(sample)) {
thread = get_idle_thread(sample->cpu);
if (thread == NULL)
pr_err("Failed to get idle thread for cpu %d.\n", sample->cpu);
@@ -2547,7 +2533,6 @@ static struct thread *timehist_get_thread(struct perf_sched *sched,
static bool timehist_skip_sample(struct perf_sched *sched,
struct thread *thread,
- struct evsel *evsel,
struct perf_sample *sample)
{
bool rc = false;
@@ -2569,7 +2554,7 @@ static bool timehist_skip_sample(struct perf_sched *sched,
tr = thread__get_runtime(thread);
if (tr && tr->prio != -1)
prio = tr->prio;
- else if (evsel__name_is(evsel, "sched:sched_switch"))
+ else if (evsel__name_is(sample->evsel, "sched:sched_switch"))
prio = perf_sample__intval(sample, "prev_prio");
if (prio != -1 && !test_bit(prio, sched->prio_bitmap)) {
@@ -2579,7 +2564,7 @@ static bool timehist_skip_sample(struct perf_sched *sched,
}
if (sched->idle_hist) {
- if (!evsel__name_is(evsel, "sched:sched_switch"))
+ if (!evsel__name_is(sample->evsel, "sched:sched_switch"))
rc = true;
else if (perf_sample__intval(sample, "prev_pid") != 0 &&
perf_sample__intval(sample, "next_pid") != 0)
@@ -2590,7 +2575,6 @@ static bool timehist_skip_sample(struct perf_sched *sched,
}
static void timehist_print_wakeup_event(struct perf_sched *sched,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine,
struct thread *awakened)
@@ -2603,8 +2587,8 @@ static void timehist_print_wakeup_event(struct perf_sched *sched,
return;
/* show wakeup unless both awakee and awaker are filtered */
- if (timehist_skip_sample(sched, thread, evsel, sample) &&
- timehist_skip_sample(sched, awakened, evsel, sample)) {
+ if (timehist_skip_sample(sched, thread, sample) &&
+ timehist_skip_sample(sched, awakened, sample)) {
thread__put(thread);
return;
}
@@ -2628,7 +2612,6 @@ static void timehist_print_wakeup_event(struct perf_sched *sched,
static int timehist_sched_wakeup_ignore(const struct perf_tool *tool __maybe_unused,
union perf_event *event __maybe_unused,
- struct evsel *evsel __maybe_unused,
struct perf_sample *sample __maybe_unused,
struct machine *machine __maybe_unused)
{
@@ -2637,7 +2620,6 @@ static int timehist_sched_wakeup_ignore(const struct perf_tool *tool __maybe_unu
static int timehist_sched_wakeup_event(const struct perf_tool *tool,
union perf_event *event __maybe_unused,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -2663,14 +2645,13 @@ static int timehist_sched_wakeup_event(const struct perf_tool *tool,
/* show wakeups if requested */
if (sched->show_wakeups &&
!perf_time__skip_sample(&sched->ptime, sample->time))
- timehist_print_wakeup_event(sched, evsel, sample, machine, thread);
+ timehist_print_wakeup_event(sched, sample, machine, thread);
thread__put(thread);
return 0;
}
static void timehist_print_migration_event(struct perf_sched *sched,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine,
struct thread *migrated)
@@ -2691,8 +2672,8 @@ static void timehist_print_migration_event(struct perf_sched *sched,
if (thread == NULL)
return;
- if (timehist_skip_sample(sched, thread, evsel, sample) &&
- timehist_skip_sample(sched, migrated, evsel, sample)) {
+ if (timehist_skip_sample(sched, thread, sample) &&
+ timehist_skip_sample(sched, migrated, sample)) {
thread__put(thread);
return;
}
@@ -2726,7 +2707,6 @@ static void timehist_print_migration_event(struct perf_sched *sched,
static int timehist_migrate_task_event(const struct perf_tool *tool,
union perf_event *event __maybe_unused,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -2751,8 +2731,7 @@ static int timehist_migrate_task_event(const struct perf_tool *tool,
/* show migrations if requested */
if (sched->show_migrations) {
- timehist_print_migration_event(sched, evsel, sample,
- machine, thread);
+ timehist_print_migration_event(sched, sample, machine, thread);
}
thread__put(thread);
@@ -2784,7 +2763,6 @@ static void timehist_update_task_prio(struct perf_sample *sample,
static int timehist_sched_change_event(const struct perf_tool *tool,
union perf_event *event,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -2808,13 +2786,13 @@ static int timehist_sched_change_event(const struct perf_tool *tool,
if (sched->show_prio || sched->prio_str)
timehist_update_task_prio(sample, machine);
- thread = timehist_get_thread(sched, sample, machine, evsel);
+ thread = timehist_get_thread(sched, sample, machine);
if (thread == NULL) {
rc = -1;
goto out;
}
- if (timehist_skip_sample(sched, thread, evsel, sample))
+ if (timehist_skip_sample(sched, thread, sample))
goto out;
tr = thread__get_runtime(thread);
@@ -2823,7 +2801,7 @@ static int timehist_sched_change_event(const struct perf_tool *tool,
goto out;
}
- tprev = evsel__get_time(evsel, sample->cpu);
+ tprev = evsel__get_time(sample->evsel, sample->cpu);
/*
* If start time given:
@@ -2913,7 +2891,7 @@ static int timehist_sched_change_event(const struct perf_tool *tool,
tr->migrated = 0;
}
- evsel__save_time(evsel, sample->time, sample->cpu);
+ evsel__save_time(sample->evsel, sample->time, sample->cpu);
thread__put(thread);
addr_location__exit(&al);
@@ -2922,11 +2900,10 @@ static int timehist_sched_change_event(const struct perf_tool *tool,
static int timehist_sched_switch_event(const struct perf_tool *tool,
union perf_event *event,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine __maybe_unused)
{
- return timehist_sched_change_event(tool, event, evsel, sample, machine);
+ return timehist_sched_change_event(tool, event, sample, machine);
}
static int process_lost(const struct perf_tool *tool __maybe_unused,
@@ -3174,7 +3151,6 @@ static void timehist_print_summary(struct perf_sched *sched,
typedef int (*sched_handler)(const struct perf_tool *tool,
union perf_event *event,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine);
@@ -3196,7 +3172,7 @@ static int perf_timehist__process_sample(const struct perf_tool *tool,
if (evsel->handler != NULL) {
sched_handler f = evsel->handler;
- err = f(tool, event, evsel, sample, machine);
+ err = f(tool, event, sample, machine);
}
return err;
--
2.54.0.746.g67dd491aae-goog