]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
perf inject: Don't pass evsel with sample
authorIan Rogers <irogers@google.com>
Wed, 20 May 2026 19:05:18 +0000 (12:05 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 20 May 2026 19:39:40 +0000 (16:39 -0300)
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 inject-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@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexandre Ghiti <alex@ghiti.fr>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Andrew Jones <ajones@ventanamicro.com>
Cc: Anup Patel <anup@brainfault.org>
Cc: Athira Rajeev <atrajeev@linux.ibm.com>
Cc: Blake Jones <blakejones@google.com>
Cc: Chen Ni <nichen@iscas.ac.cn>
Cc: Chun-Tse Shao <ctshao@google.com>
Cc: Dapeng Mi <dapeng1.mi@linux.intel.com>
Cc: Derek Foreman <derek.foreman@collabora.com>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Dr. David Alan Gilbert <linux@treblig.org>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Hrishikesh Suresh <hrishikesh123s@gmail.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Krzysztof Ɓopatowski <krzysztof.m.lopatowski@gmail.com>
Cc: Leo Yan <leo.yan@arm.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Paul Walmsley <pjw@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Quan Zhou <zhouquan@iscas.ac.cn>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Swapnil Sapkal <swapnil.sapkal@amd.com>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Cc: Tianyou Li <tianyou.li@intel.com>
Cc: Yujie Liu <yujie.liu@intel.com>
Cc: tanze <tanze@kylinos.cn>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-inject.c
tools/perf/util/synthetic-events.c
tools/perf/util/synthetic-events.h

index 92ce2be1e5e29feda3c26c6bcc0320c209e419a9..41a3721a194dc9b958549505ac6342994206c41f 100644 (file)
@@ -147,14 +147,12 @@ struct event_entry {
 static int tool__inject_build_id(const struct perf_tool *tool,
                                 struct perf_sample *sample,
                                 struct machine *machine,
-                                const struct evsel *evsel,
                                 __u16 misc,
                                 const char *filename,
                                 struct dso *dso, u32 flags);
 static int tool__inject_mmap2_build_id(const struct perf_tool *tool,
                                      struct perf_sample *sample,
                                      struct machine *machine,
-                                     const struct evsel *evsel,
                                      __u16 misc,
                                      __u32 pid, __u32 tid,
                                      __u64 start, __u64 len, __u64 pgoff,
@@ -397,7 +395,6 @@ perf_inject__cut_auxtrace_sample(struct perf_inject *inject,
 typedef int (*inject_handler)(const struct perf_tool *tool,
                              union perf_event *event,
                              struct perf_sample *sample,
-                             struct evsel *evsel,
                              struct machine *machine);
 
 static int perf_event__repipe_sample(const struct perf_tool *tool,
@@ -413,7 +410,7 @@ static int perf_event__repipe_sample(const struct perf_tool *tool,
 
        if (evsel->handler) {
                inject_handler f = evsel->handler;
-               return f(tool, event, sample, evsel, machine);
+               return f(tool, event, sample, machine);
        }
 
        build_id__mark_dso_hit(tool, event, sample, machine);
@@ -696,11 +693,12 @@ static int perf_event__repipe_common_mmap(const struct perf_tool *tool,
                }
 
                if (dso && !dso__hit(dso)) {
-                       struct evsel *evsel = evlist__event2evsel(inject->session->evlist, event);
+                       if (!sample->evsel)
+                               sample->evsel = evlist__event2evsel(inject->session->evlist, event);
 
-                       if (evsel) {
+                       if (sample->evsel) {
                                dso__set_hit(dso);
-                               tool__inject_build_id(tool, sample, machine, evsel,
+                               tool__inject_build_id(tool, sample, machine,
                                                      /*misc=*/sample->cpumode,
                                                      filename, dso, flags);
                        }
@@ -727,23 +725,26 @@ static int perf_event__repipe_common_mmap(const struct perf_tool *tool,
        }
        if ((inject->build_id_style == BID_RWS__MMAP2_BUILDID_ALL) &&
            !(event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID)) {
-               struct evsel *evsel = evlist__event2evsel(inject->session->evlist, event);
+               struct evsel *saved_evsel = sample->evsel;
 
-               if (evsel && !dso_sought) {
+               sample->evsel = evlist__event2evsel(inject->session->evlist, event);
+               if (sample->evsel && !dso_sought) {
                        dso = findnew_dso(pid, tid, filename, dso_id, machine);
                        dso_sought = true;
                }
-               if (evsel && dso &&
-                   !tool__inject_mmap2_build_id(tool, sample, machine, evsel,
+               if (sample->evsel && dso &&
+                   !tool__inject_mmap2_build_id(tool, sample, machine,
                                                 sample->cpumode | PERF_RECORD_MISC_MMAP_BUILD_ID,
                                                 pid, tid, start, len, pgoff,
                                                 dso,
                                                 prot, flags,
                                                 filename)) {
                        /* Injected mmap2 so no need to repipe. */
+                       sample->evsel = saved_evsel;
                        dso__put(dso);
                        return 0;
                }
+               sample->evsel = saved_evsel;
        }
        dso__put(dso);
        if (inject->build_id_style == BID_RWS__MMAP2_BUILDID_LAZY)
@@ -948,7 +949,6 @@ static bool perf_inject__lookup_known_build_id(struct perf_inject *inject,
 static int tool__inject_build_id(const struct perf_tool *tool,
                                 struct perf_sample *sample,
                                 struct machine *machine,
-                                const struct evsel *evsel,
                                 __u16 misc,
                                 const char *filename,
                                 struct dso *dso, u32 flags)
@@ -972,7 +972,7 @@ static int tool__inject_build_id(const struct perf_tool *tool,
 
        err = perf_event__synthesize_build_id(tool, sample, machine,
                                              perf_event__repipe,
-                                             evsel, misc, dso__bid(dso),
+                                             misc, dso__bid(dso),
                                              filename);
        if (err) {
                pr_err("Can't synthesize build_id event for %s\n", filename);
@@ -985,7 +985,6 @@ static int tool__inject_build_id(const struct perf_tool *tool,
 static int tool__inject_mmap2_build_id(const struct perf_tool *tool,
                                       struct perf_sample *sample,
                                       struct machine *machine,
-                                      const struct evsel *evsel,
                                       __u16 misc,
                                       __u32 pid, __u32 tid,
                                       __u64 start, __u64 len, __u64 pgoff,
@@ -1008,7 +1007,6 @@ static int tool__inject_mmap2_build_id(const struct perf_tool *tool,
 
        err = perf_event__synthesize_mmap2_build_id(tool, sample, machine,
                                                    perf_event__repipe,
-                                                   evsel,
                                                    misc, pid, tid,
                                                    start, len, pgoff,
                                                    dso__bid(dso),
@@ -1025,7 +1023,7 @@ static int mark_dso_hit(const struct perf_inject *inject,
                        const struct perf_tool *tool,
                        struct perf_sample *sample,
                        struct machine *machine,
-                       const struct evsel *mmap_evsel,
+                       struct evsel *mmap_evsel,
                        struct map *map, bool sample_in_dso)
 {
        struct dso *dso;
@@ -1053,9 +1051,13 @@ static int mark_dso_hit(const struct perf_inject *inject,
        dso = map__dso(map);
        if (inject->build_id_style == BID_RWS__INJECT_HEADER_LAZY) {
                if (dso && !dso__hit(dso)) {
+                       /*
+                        * The sample is just read for identifiers which we want
+                        * to match the for the event of the sample.
+                        */
                        dso__set_hit(dso);
                        tool__inject_build_id(tool, sample, machine,
-                                            mmap_evsel, misc, dso__long_name(dso), dso,
+                                            misc, dso__long_name(dso), dso,
                                             map__flags(map));
                }
        } else if (inject->build_id_style == BID_RWS__MMAP2_BUILDID_LAZY) {
@@ -1063,11 +1065,13 @@ static int mark_dso_hit(const struct perf_inject *inject,
                        const struct build_id null_bid = { .size = 0 };
                        const struct build_id *bid = dso ? dso__bid(dso) : &null_bid;
                        const char *filename = dso ? dso__long_name(dso) : "";
+                       struct evsel *saved_evsel = sample->evsel;
 
                        map__set_hit(map);
+                       /* Creating a new mmap2 event which has an evsel for the mmap event. */
+                       sample->evsel = mmap_evsel;
                        perf_event__synthesize_mmap2_build_id(tool, sample, machine,
                                                                perf_event__repipe,
-                                                               mmap_evsel,
                                                                misc,
                                                                sample->pid, sample->tid,
                                                                map__start(map),
@@ -1077,6 +1081,7 @@ static int mark_dso_hit(const struct perf_inject *inject,
                                                                map__prot(map),
                                                                map__flags(map),
                                                                filename);
+                       sample->evsel = saved_evsel;
                }
        }
        return 0;
@@ -1087,7 +1092,7 @@ struct mark_dso_hit_args {
        const struct perf_tool *tool;
        struct perf_sample *sample;
        struct machine *machine;
-       const struct evsel *mmap_evsel;
+       struct evsel *mmap_evsel;
 };
 
 static int mark_dso_hit_callback(struct callchain_cursor_node *node, void *data)
@@ -1142,7 +1147,6 @@ repipe:
 static int perf_inject__sched_process_exit(const struct perf_tool *tool,
                                           union perf_event *event __maybe_unused,
                                           struct perf_sample *sample,
-                                          struct evsel *evsel __maybe_unused,
                                           struct machine *machine __maybe_unused)
 {
        struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
@@ -1162,13 +1166,12 @@ static int perf_inject__sched_process_exit(const struct perf_tool *tool,
 static int perf_inject__sched_switch(const struct perf_tool *tool,
                                     union perf_event *event,
                                     struct perf_sample *sample,
-                                    struct evsel *evsel,
                                     struct machine *machine)
 {
        struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
        struct event_entry *ent;
 
-       perf_inject__sched_process_exit(tool, event, sample, evsel, machine);
+       perf_inject__sched_process_exit(tool, event, sample, machine);
 
        ent = malloc(event->header.size + sizeof(struct event_entry));
        if (ent == NULL) {
@@ -1187,13 +1190,13 @@ static int perf_inject__sched_switch(const struct perf_tool *tool,
 static int perf_inject__sched_stat(const struct perf_tool *tool,
                                   union perf_event *event __maybe_unused,
                                   struct perf_sample *sample,
-                                  struct evsel *evsel,
                                   struct machine *machine)
 {
        struct event_entry *ent;
        union perf_event *event_sw;
        struct perf_sample sample_sw;
        struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
+       struct evsel *evsel = sample->evsel;
        u32 pid = perf_sample__intval(sample, "pid");
        int ret;
 
@@ -1559,7 +1562,7 @@ static int synthesize_build_id(struct perf_inject *inject, struct dso *dso, pid_
        dso__set_hit(dso);
 
        return perf_event__synthesize_build_id(&inject->tool, &synth_sample, machine,
-                                              process_build_id, inject__mmap_evsel(inject),
+                                              process_build_id,
                                               /*misc=*/synth_sample.cpumode,
                                               dso__bid(dso), dso__long_name(dso));
 }
@@ -2121,7 +2124,6 @@ static int evsel__check_stype(struct evsel *evsel, u64 sample_type, const char *
 static int drop_sample(const struct perf_tool *tool __maybe_unused,
                       union perf_event *event __maybe_unused,
                       struct perf_sample *sample __maybe_unused,
-                      struct evsel *evsel __maybe_unused,
                       struct machine *machine __maybe_unused)
 {
        return 0;
index 2461f25a4d7dc2d72d63ea320fb5c9597d15dc90..fd1d4c0345d6f95e88f86dbdccc834f55d58bcbc 100644 (file)
@@ -2263,13 +2263,15 @@ int perf_event__synthesize_build_id(const struct perf_tool *tool,
                                    struct perf_sample *sample,
                                    struct machine *machine,
                                    perf_event__handler_t process,
-                                   const struct evsel *evsel,
                                    __u16 misc,
                                    const struct build_id *bid,
                                    const char *filename)
 {
        union perf_event ev;
        size_t len;
+       u64 sample_type = sample->evsel ? sample->evsel->core.attr.sample_type : 0;
+       void *array = &ev;
+       int ret;
 
        len = sizeof(ev.build_id) + strlen(filename) + 1;
        len = PERF_ALIGN(len, sizeof(u64));
@@ -2286,23 +2288,17 @@ int perf_event__synthesize_build_id(const struct perf_tool *tool,
        ev.build_id.header.size = len;
        strcpy(ev.build_id.filename, filename);
 
-       if (evsel) {
-               void *array = &ev;
-               int ret;
-
-               array += ev.header.size;
-               ret = perf_event__synthesize_id_sample(array, evsel->core.attr.sample_type, sample);
-               if (ret < 0)
-                       return ret;
-
-               if (ret & 7) {
-                       pr_err("Bad id sample size %d\n", ret);
-                       return -EINVAL;
-               }
+       array += ev.header.size;
+       ret = perf_event__synthesize_id_sample(array, sample_type, sample);
+       if (ret < 0)
+               return ret;
 
-               ev.header.size += ret;
+       if (ret & 7) {
+               pr_err("Bad id sample size %d\n", ret);
+               return -EINVAL;
        }
 
+       ev.header.size += ret;
        return process(tool, &ev, sample, machine);
 }
 
@@ -2310,7 +2306,6 @@ int perf_event__synthesize_mmap2_build_id(const struct perf_tool *tool,
                                          struct perf_sample *sample,
                                          struct machine *machine,
                                          perf_event__handler_t process,
-                                         const struct evsel *evsel,
                                          __u16 misc,
                                          __u32 pid, __u32 tid,
                                          __u64 start, __u64 len, __u64 pgoff,
@@ -2320,6 +2315,7 @@ int perf_event__synthesize_mmap2_build_id(const struct perf_tool *tool,
 {
        union perf_event ev;
        size_t ev_len;
+       u64 sample_type = sample->evsel ? sample->evsel->core.attr.sample_type : 0;
        void *array;
        int ret;
 
@@ -2350,7 +2346,7 @@ int perf_event__synthesize_mmap2_build_id(const struct perf_tool *tool,
 
        array = &ev;
        array += ev.header.size;
-       ret = perf_event__synthesize_id_sample(array, evsel->core.attr.sample_type, sample);
+       ret = perf_event__synthesize_id_sample(array, sample_type, sample);
        if (ret < 0)
                return ret;
 
index 8c7f49f9ccf54a69952dc0b7cfe16c3c774301d0..243115ea61ae0a051bd360543856310ce0186100 100644 (file)
@@ -50,7 +50,6 @@ int perf_event__synthesize_build_id(const struct perf_tool *tool,
                                    struct perf_sample *sample,
                                    struct machine *machine,
                                    perf_event__handler_t process,
-                                   const struct evsel *evsel,
                                    __u16 misc,
                                    const struct build_id *bid,
                                    const char *filename);
@@ -58,7 +57,6 @@ int perf_event__synthesize_mmap2_build_id(const struct perf_tool *tool,
                                          struct perf_sample *sample,
                                          struct machine *machine,
                                          perf_event__handler_t process,
-                                         const struct evsel *evsel,
                                          __u16 misc,
                                          __u32 pid, __u32 tid,
                                          __u64 start, __u64 len, __u64 pgoff,