[PATCH v14 14/32] perf kwork: Don't pass evsel with sample

From: Ian Rogers

Date: Wed May 20 2026 - 15:24:36 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 kwork-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-kwork.c | 74 +++++++++++++-------------------------
tools/perf/util/kwork.h | 9 +++--
2 files changed, 28 insertions(+), 55 deletions(-)

diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
index 4b312afed830..59a54d11f7fa 100644
--- a/tools/perf/builtin-kwork.c
+++ b/tools/perf/builtin-kwork.c
@@ -448,7 +448,6 @@ static int work_push_atom(struct perf_kwork *kwork,
struct kwork_class *class,
enum kwork_trace_type src_type,
enum kwork_trace_type dst_type,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine,
struct kwork_work **ret_work,
@@ -458,7 +457,7 @@ static int work_push_atom(struct perf_kwork *kwork,
struct kwork_work *work, key;

BUG_ON(class->work_init == NULL);
- class->work_init(kwork, class, &key, src_type, evsel, sample, machine);
+ class->work_init(kwork, class, &key, src_type, sample, machine);

atom = atom_new(kwork, sample);
if (atom == NULL)
@@ -507,7 +506,6 @@ static struct kwork_atom *work_pop_atom(struct perf_kwork *kwork,
struct kwork_class *class,
enum kwork_trace_type src_type,
enum kwork_trace_type dst_type,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine,
struct kwork_work **ret_work)
@@ -516,7 +514,7 @@ static struct kwork_atom *work_pop_atom(struct perf_kwork *kwork,
struct kwork_work *work, key;

BUG_ON(class->work_init == NULL);
- class->work_init(kwork, class, &key, src_type, evsel, sample, machine);
+ class->work_init(kwork, class, &key, src_type, sample, machine);

work = work_findnew(&class->work_root, &key, &kwork->cmp_id);
if (ret_work != NULL)
@@ -599,18 +597,16 @@ static void report_update_exit_event(struct kwork_work *work,

static int report_entry_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
return work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
- KWORK_TRACE_MAX, evsel, sample,
+ KWORK_TRACE_MAX, sample,
machine, NULL, true);
}

static int report_exit_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -618,7 +614,7 @@ static int report_exit_event(struct perf_kwork *kwork,
struct kwork_work *work = NULL;

atom = work_pop_atom(kwork, class, KWORK_TRACE_EXIT,
- KWORK_TRACE_ENTRY, evsel, sample,
+ KWORK_TRACE_ENTRY, sample,
machine, &work);
if (work == NULL)
return -1;
@@ -654,18 +650,16 @@ static void latency_update_entry_event(struct kwork_work *work,

static int latency_raise_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
return work_push_atom(kwork, class, KWORK_TRACE_RAISE,
- KWORK_TRACE_MAX, evsel, sample,
+ KWORK_TRACE_MAX, sample,
machine, NULL, true);
}

static int latency_entry_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -673,7 +667,7 @@ static int latency_entry_event(struct perf_kwork *kwork,
struct kwork_work *work = NULL;

atom = work_pop_atom(kwork, class, KWORK_TRACE_ENTRY,
- KWORK_TRACE_RAISE, evsel, sample,
+ KWORK_TRACE_RAISE, sample,
machine, &work);
if (work == NULL)
return -1;
@@ -812,18 +806,16 @@ static void timehist_print_event(struct perf_kwork *kwork,

static int timehist_raise_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
return work_push_atom(kwork, class, KWORK_TRACE_RAISE,
- KWORK_TRACE_MAX, evsel, sample,
+ KWORK_TRACE_MAX, sample,
machine, NULL, true);
}

static int timehist_entry_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -831,7 +823,7 @@ static int timehist_entry_event(struct perf_kwork *kwork,
struct kwork_work *work = NULL;

ret = work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
- KWORK_TRACE_RAISE, evsel, sample,
+ KWORK_TRACE_RAISE, sample,
machine, &work, true);
if (ret)
return ret;
@@ -844,7 +836,6 @@ static int timehist_entry_event(struct perf_kwork *kwork,

static int timehist_exit_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -861,7 +852,7 @@ static int timehist_exit_event(struct perf_kwork *kwork,
}

atom = work_pop_atom(kwork, class, KWORK_TRACE_EXIT,
- KWORK_TRACE_ENTRY, evsel, sample,
+ KWORK_TRACE_ENTRY, sample,
machine, &work);
if (work == NULL) {
ret = -1;
@@ -895,18 +886,16 @@ static void top_update_runtime(struct kwork_work *work,

static int top_entry_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
return work_push_atom(kwork, class, KWORK_TRACE_ENTRY,
- KWORK_TRACE_MAX, evsel, sample,
+ KWORK_TRACE_MAX, sample,
machine, NULL, true);
}

static int top_exit_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -915,7 +904,7 @@ static int top_exit_event(struct perf_kwork *kwork,
struct kwork_atom *atom;

atom = work_pop_atom(kwork, class, KWORK_TRACE_EXIT,
- KWORK_TRACE_ENTRY, evsel, sample,
+ KWORK_TRACE_ENTRY, sample,
machine, &work);
if (!work)
return -1;
@@ -936,7 +925,6 @@ static int top_exit_event(struct perf_kwork *kwork,

static int top_sched_switch_event(struct perf_kwork *kwork,
struct kwork_class *class,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -944,7 +932,7 @@ static int top_sched_switch_event(struct perf_kwork *kwork,
struct kwork_work *work;

atom = work_pop_atom(kwork, class, KWORK_TRACE_EXIT,
- KWORK_TRACE_ENTRY, evsel, sample,
+ KWORK_TRACE_ENTRY, sample,
machine, &work);
if (!work)
return -1;
@@ -954,12 +942,11 @@ static int top_sched_switch_event(struct perf_kwork *kwork,
atom_del(atom);
}

- return top_entry_event(kwork, class, evsel, sample, machine);
+ return top_entry_event(kwork, class, sample, machine);
}

static struct kwork_class kwork_irq;
static int process_irq_handler_entry_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -967,12 +954,11 @@ static int process_irq_handler_entry_event(const struct perf_tool *tool,

if (kwork->tp_handler->entry_event)
return kwork->tp_handler->entry_event(kwork, &kwork_irq,
- evsel, sample, machine);
+ sample, machine);
return 0;
}

static int process_irq_handler_exit_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -980,7 +966,7 @@ static int process_irq_handler_exit_event(const struct perf_tool *tool,

if (kwork->tp_handler->exit_event)
return kwork->tp_handler->exit_event(kwork, &kwork_irq,
- evsel, sample, machine);
+ sample, machine);
return 0;
}

@@ -1005,7 +991,6 @@ static void irq_work_init(struct perf_kwork *kwork,
struct kwork_class *class,
struct kwork_work *work,
enum kwork_trace_type src_type __maybe_unused,
- struct evsel *evsel __maybe_unused,
struct perf_sample *sample,
struct machine *machine __maybe_unused)
{
@@ -1038,7 +1023,6 @@ static struct kwork_class kwork_irq = {

static struct kwork_class kwork_softirq;
static int process_softirq_raise_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1046,13 +1030,12 @@ static int process_softirq_raise_event(const struct perf_tool *tool,

if (kwork->tp_handler->raise_event)
return kwork->tp_handler->raise_event(kwork, &kwork_softirq,
- evsel, sample, machine);
+ sample, machine);

return 0;
}

static int process_softirq_entry_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1060,13 +1043,12 @@ static int process_softirq_entry_event(const struct perf_tool *tool,

if (kwork->tp_handler->entry_event)
return kwork->tp_handler->entry_event(kwork, &kwork_softirq,
- evsel, sample, machine);
+ sample, machine);

return 0;
}

static int process_softirq_exit_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1074,7 +1056,7 @@ static int process_softirq_exit_event(const struct perf_tool *tool,

if (kwork->tp_handler->exit_event)
return kwork->tp_handler->exit_event(kwork, &kwork_softirq,
- evsel, sample, machine);
+ sample, machine);

return 0;
}
@@ -1133,7 +1115,6 @@ static void softirq_work_init(struct perf_kwork *kwork,
struct kwork_class *class,
struct kwork_work *work,
enum kwork_trace_type src_type __maybe_unused,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine __maybe_unused)
{
@@ -1148,7 +1129,7 @@ static void softirq_work_init(struct perf_kwork *kwork,
} else {
num = perf_sample__intval(sample, "vec");
work->id = num;
- work->name = evsel__softirq_name(evsel, num);
+ work->name = evsel__softirq_name(sample->evsel, num);
}
}

@@ -1169,7 +1150,6 @@ static struct kwork_class kwork_softirq = {

static struct kwork_class kwork_workqueue;
static int process_workqueue_activate_work_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1177,13 +1157,12 @@ static int process_workqueue_activate_work_event(const struct perf_tool *tool,

if (kwork->tp_handler->raise_event)
return kwork->tp_handler->raise_event(kwork, &kwork_workqueue,
- evsel, sample, machine);
+ sample, machine);

return 0;
}

static int process_workqueue_execute_start_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1191,13 +1170,12 @@ static int process_workqueue_execute_start_event(const struct perf_tool *tool,

if (kwork->tp_handler->entry_event)
return kwork->tp_handler->entry_event(kwork, &kwork_workqueue,
- evsel, sample, machine);
+ sample, machine);

return 0;
}

static int process_workqueue_execute_end_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1205,7 +1183,7 @@ static int process_workqueue_execute_end_event(const struct perf_tool *tool,

if (kwork->tp_handler->exit_event)
return kwork->tp_handler->exit_event(kwork, &kwork_workqueue,
- evsel, sample, machine);
+ sample, machine);

return 0;
}
@@ -1233,7 +1211,6 @@ static void workqueue_work_init(struct perf_kwork *kwork __maybe_unused,
struct kwork_class *class,
struct kwork_work *work,
enum kwork_trace_type src_type __maybe_unused,
- struct evsel *evsel __maybe_unused,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1267,7 +1244,6 @@ static struct kwork_class kwork_workqueue = {

static struct kwork_class kwork_sched;
static int process_sched_switch_event(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine)
{
@@ -1275,7 +1251,7 @@ static int process_sched_switch_event(const struct perf_tool *tool,

if (kwork->tp_handler->sched_switch_event)
return kwork->tp_handler->sched_switch_event(kwork, &kwork_sched,
- evsel, sample, machine);
+ sample, machine);
return 0;
}

@@ -1300,7 +1276,6 @@ static void sched_work_init(struct perf_kwork *kwork __maybe_unused,
struct kwork_class *class,
struct kwork_work *work,
enum kwork_trace_type src_type,
- struct evsel *evsel __maybe_unused,
struct perf_sample *sample,
struct machine *machine __maybe_unused)
{
@@ -1946,7 +1921,6 @@ static int perf_kwork__report(struct perf_kwork *kwork)
}

typedef int (*tracepoint_handler)(const struct perf_tool *tool,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine);

@@ -1961,7 +1935,7 @@ static int perf_kwork__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;
diff --git a/tools/perf/util/kwork.h b/tools/perf/util/kwork.h
index db00269b73f2..abf637d44794 100644
--- a/tools/perf/util/kwork.h
+++ b/tools/perf/util/kwork.h
@@ -157,7 +157,6 @@ struct kwork_class {
struct kwork_class *class,
struct kwork_work *work,
enum kwork_trace_type src_type,
- struct evsel *evsel,
struct perf_sample *sample,
struct machine *machine);

@@ -167,19 +166,19 @@ struct kwork_class {

struct trace_kwork_handler {
int (*raise_event)(struct perf_kwork *kwork,
- struct kwork_class *class, struct evsel *evsel,
+ struct kwork_class *class,
struct perf_sample *sample, struct machine *machine);

int (*entry_event)(struct perf_kwork *kwork,
- struct kwork_class *class, struct evsel *evsel,
+ struct kwork_class *class,
struct perf_sample *sample, struct machine *machine);

int (*exit_event)(struct perf_kwork *kwork,
- struct kwork_class *class, struct evsel *evsel,
+ struct kwork_class *class,
struct perf_sample *sample, struct machine *machine);

int (*sched_switch_event)(struct perf_kwork *kwork,
- struct kwork_class *class, struct evsel *evsel,
+ struct kwork_class *class,
struct perf_sample *sample, struct machine *machine);
};

--
2.54.0.746.g67dd491aae-goog