From: Ian Rogers <irogers@google.com>
To: acme@kernel.org, namhyung@kernel.org
Cc: irogers@google.com, adrian.hunter@intel.com,
ajones@ventanamicro.com, ak@linux.intel.com, alex@ghiti.fr,
alexander.shishkin@linux.intel.com, anup@brainfault.org,
aou@eecs.berkeley.edu, atrajeev@linux.ibm.com,
blakejones@google.com, ctshao@google.com,
dapeng1.mi@linux.intel.com, derek.foreman@collabora.com,
dvyukov@google.com, howardchu95@gmail.com,
hrishikesh123s@gmail.com, james.clark@linaro.org,
jolsa@kernel.org, krzysztof.m.lopatowski@gmail.com,
leo.yan@arm.com, linux-kernel@vger.kernel.org,
linux-perf-users@vger.kernel.org, linux@treblig.org,
mingo@redhat.com, nichen@iscas.ac.cn, palmer@dabbelt.com,
peterz@infradead.org, pjw@kernel.org, ravi.bangoria@amd.com,
swapnil.sapkal@amd.com, tanze@kylinos.cn,
thomas.falcon@intel.com, tianyou.li@intel.com,
yujie.liu@intel.com, zhouquan@iscas.ac.cn
Subject: [PATCH v6 02/25] perf sample: Make sure perf_sample__init/exit are used
Date: Fri, 3 Apr 2026 20:43:02 -0700 [thread overview]
Message-ID: <20260404034325.3172592-3-irogers@google.com> (raw)
In-Reply-To: <20260404034325.3172592-1-irogers@google.com>
The deferred stack trace code wasn't using perf_sample__init/exit. Add
the deferred stack trace clean up to perf_sample__exit which requires
proper NULL initialization in perf_sample__init. Make the
perf_sample__exit robust to being called more than once by using
zfree. Make the error paths in evsel__parse_sample exit the
sample. Add a merged_callchain boolean to capture that callchain is
allocated, deferred_callchain doen't suffice for this. Pack the struct
variables to avoid padding bytes for this.
Similiarly powerpc_vpadtl_sample wasn't using perf_sample__init/exit,
use it for consistency and potential issues with uninitialized
variables.
Similarly guest_session__inject_events in builtin-inject wasn't using
perf_sample_init/exit. The lifetime management for fetched events is
somewhat complex there, but when an event is fetched the sample should
be initialized and needs exiting on error. The sample may be left in
place so that future injects have access to it.
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/builtin-inject.c | 55 +++++++++++++++++++++---------
tools/perf/tests/perf-record.c | 1 +
tools/perf/tests/switch-tracking.c | 2 ++
tools/perf/util/callchain.c | 10 ++++--
tools/perf/util/evlist.c | 5 ++-
tools/perf/util/evsel.c | 34 +++++++++++-------
tools/perf/util/powerpc-vpadtl.c | 10 +++---
tools/perf/util/sample.c | 10 ++++--
tools/perf/util/sample.h | 17 +++++----
tools/perf/util/session.c | 13 ++++---
10 files changed, 108 insertions(+), 49 deletions(-)
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index 5b29f4296861..d63191ae4c5b 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -1087,6 +1087,7 @@ static int perf_inject__sched_stat(const struct perf_tool *tool,
struct perf_sample sample_sw;
struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
u32 pid = evsel__intval(evsel, sample, "pid");
+ int ret;
list_for_each_entry(ent, &inject->samples, node) {
if (pid == ent->tid)
@@ -1103,7 +1104,9 @@ static int perf_inject__sched_stat(const struct perf_tool *tool,
perf_event__synthesize_sample(event_sw, evsel->core.attr.sample_type,
evsel->core.attr.read_format, &sample_sw);
build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
- return perf_event__repipe(tool, event_sw, &sample_sw, machine);
+ ret = perf_event__repipe(tool, event_sw, &sample_sw, machine);
+ perf_sample__exit(&sample_sw);
+ return ret;
}
#endif
@@ -1648,6 +1651,7 @@ static int guest_session__fetch(struct guest_session *gs)
size_t hdr_sz = sizeof(*hdr);
ssize_t ret;
+ perf_sample__init(&gs->ev.sample, /*all=*/false);
buf = gs->ev.event_buf;
if (!buf) {
buf = malloc(PERF_SAMPLE_MAX_SIZE);
@@ -1745,18 +1749,24 @@ static int guest_session__inject_events(struct guest_session *gs, u64 timestamp)
if (!gs->fetched) {
ret = guest_session__fetch(gs);
if (ret)
- return ret;
+ break;
gs->fetched = true;
}
ev = gs->ev.event;
sample = &gs->ev.sample;
- if (!ev->header.size)
- return 0; /* EOF */
-
- if (sample->time > timestamp)
- return 0;
+ if (!ev->header.size) {
+ /* EOF */
+ perf_sample__exit(&gs->ev.sample);
+ gs->fetched = false;
+ ret = 0;
+ break;
+ }
+ if (sample->time > timestamp) {
+ ret = 0;
+ break;
+ }
/* Change cpumode to guest */
cpumode = ev->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
@@ -1779,12 +1789,14 @@ static int guest_session__inject_events(struct guest_session *gs, u64 timestamp)
if (id_hdr_size & 7) {
pr_err("Bad id_hdr_size %u\n", id_hdr_size);
- return -EINVAL;
+ ret = -EINVAL;
+ break;
}
if (ev->header.size & 7) {
pr_err("Bad event size %u\n", ev->header.size);
- return -EINVAL;
+ ret = -EINVAL;
+ break;
}
/* Remove guest id sample */
@@ -1792,14 +1804,16 @@ static int guest_session__inject_events(struct guest_session *gs, u64 timestamp)
if (ev->header.size & 7) {
pr_err("Bad raw event size %u\n", ev->header.size);
- return -EINVAL;
+ ret = -EINVAL;
+ break;
}
guest_id = guest_session__lookup_id(gs, id);
if (!guest_id) {
pr_err("Guest event with unknown id %llu\n",
(unsigned long long)id);
- return -EINVAL;
+ ret = -EINVAL;
+ break;
}
/* Change to host ID to avoid conflicting ID values */
@@ -1819,19 +1833,28 @@ static int guest_session__inject_events(struct guest_session *gs, u64 timestamp)
/* New id sample with new ID and CPU */
ret = evlist__append_id_sample(inject->session->evlist, ev, sample);
if (ret)
- return ret;
+ break;
if (ev->header.size & 7) {
pr_err("Bad new event size %u\n", ev->header.size);
- return -EINVAL;
+ ret = -EINVAL;
+ break;
}
- gs->fetched = false;
-
ret = output_bytes(inject, ev, ev->header.size);
if (ret)
- return ret;
+ break;
+
+ /* Reset for next guest session event fetch. */
+ perf_sample__exit(sample);
+ gs->fetched = false;
}
+ if (ret && gs->fetched) {
+ /* Clear saved sample state on error. */
+ perf_sample__exit(&gs->ev.sample);
+ gs->fetched = false;
+ }
+ return ret;
}
static int guest_session__flush_events(struct guest_session *gs)
diff --git a/tools/perf/tests/perf-record.c b/tools/perf/tests/perf-record.c
index c6e31ab8a6b8..ad44cc68820b 100644
--- a/tools/perf/tests/perf-record.c
+++ b/tools/perf/tests/perf-record.c
@@ -300,6 +300,7 @@ static int test__PERF_RECORD(struct test_suite *test __maybe_unused, int subtest
}
perf_mmap__consume(&md->core);
+ perf_sample__exit(&sample);
}
perf_mmap__read_done(&md->core);
}
diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c
index 15791fcb76b2..72a8289e846d 100644
--- a/tools/perf/tests/switch-tracking.c
+++ b/tools/perf/tests/switch-tracking.c
@@ -239,11 +239,13 @@ static int add_event(struct evlist *evlist, struct list_head *events,
if (!sample.time) {
pr_debug("event with no time\n");
+ perf_sample__exit(&sample);
return -1;
}
node->event_time = sample.time;
+ perf_sample__exit(&sample);
return 0;
}
diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c
index f879b84f8ff9..f031cbbeeba8 100644
--- a/tools/perf/util/callchain.c
+++ b/tools/perf/util/callchain.c
@@ -1901,16 +1901,19 @@ int sample__merge_deferred_callchain(struct perf_sample *sample_orig,
u64 nr_deferred = sample_callchain->callchain->nr;
struct ip_callchain *callchain;
+ if (sample_orig->merged_callchain) {
+ /* Already merged. */
+ return -EINVAL;
+ }
+
if (sample_orig->callchain->nr < 2) {
sample_orig->deferred_callchain = false;
return -EINVAL;
}
callchain = calloc(1 + nr_orig + nr_deferred, sizeof(u64));
- if (callchain == NULL) {
- sample_orig->deferred_callchain = false;
+ if (callchain == NULL)
return -ENOMEM;
- }
callchain->nr = nr_orig + nr_deferred;
/* copy original including PERF_CONTEXT_USER_DEFERRED (but the cookie) */
@@ -1919,6 +1922,7 @@ int sample__merge_deferred_callchain(struct perf_sample *sample_orig,
memcpy(&callchain->ips[nr_orig], sample_callchain->callchain->ips,
nr_deferred * sizeof(u64));
+ sample_orig->merged_callchain = true;
sample_orig->callchain = callchain;
return 0;
}
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index c702741a9173..f46e1d40bad7 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -1632,8 +1632,11 @@ int evlist__parse_sample(struct evlist *evlist, union perf_event *event, struct
struct evsel *evsel = evlist__event2evsel(evlist, event);
int ret;
- if (!evsel)
+ if (!evsel) {
+ /* Ensure the sample is okay for perf_sample__exit. */
+ perf_sample__init(sample, /*all=*/false);
return -EFAULT;
+ }
ret = evsel__parse_sample(evsel, event, sample);
if (ret)
return ret;
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 1281af056cec..df2392713edb 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -3073,7 +3073,7 @@ static inline bool overflow(const void *endp, u16 max_size, const void *offset,
#define OVERFLOW_CHECK(offset, size, max_size) \
do { \
if (overflow(endp, (max_size), (offset), (size))) \
- return -EFAULT; \
+ goto out_efault; \
} while (0)
#define OVERFLOW_CHECK_u64(offset) \
@@ -3205,6 +3205,8 @@ static int __set_offcpu_sample(struct perf_sample *data)
data->cgroup = *array;
return 0;
+out_efault:
+ return -EFAULT;
}
int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
@@ -3223,7 +3225,7 @@ int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
*/
union u64_swap u;
- memset(data, 0, sizeof(*data));
+ perf_sample__init(data, /*all=*/true);
data->cpu = data->pid = data->tid = -1;
data->stream_id = data->id = data->time = -1ULL;
data->period = evsel->core.attr.sample_period;
@@ -3237,25 +3239,26 @@ int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
data->callchain = (struct ip_callchain *)&event->callchain_deferred.nr;
if (data->callchain->nr > max_callchain_nr)
- return -EFAULT;
+ goto out_efault;
data->deferred_cookie = event->callchain_deferred.cookie;
if (evsel->core.attr.sample_id_all)
perf_evsel__parse_id_sample(evsel, event, data);
+
return 0;
}
if (event->header.type != PERF_RECORD_SAMPLE) {
- if (!evsel->core.attr.sample_id_all)
- return 0;
- return perf_evsel__parse_id_sample(evsel, event, data);
+ if (evsel->core.attr.sample_id_all)
+ perf_evsel__parse_id_sample(evsel, event, data);
+ return 0;
}
array = event->sample.array;
if (perf_event__check_size(event, evsel->sample_size))
- return -EFAULT;
+ goto out_efault;
if (type & PERF_SAMPLE_IDENTIFIER) {
data->id = *array;
@@ -3348,7 +3351,7 @@ int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
sizeof(struct sample_read_value);
if (data->read.group.nr > max_group_nr)
- return -EFAULT;
+ goto out_efault;
sz = data->read.group.nr * sample_read_value_size(read_format);
OVERFLOW_CHECK(array, sz, max_size);
@@ -3376,7 +3379,7 @@ int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
data->callchain = (struct ip_callchain *)array++;
callchain_nr = data->callchain->nr;
if (callchain_nr > max_callchain_nr)
- return -EFAULT;
+ goto out_efault;
sz = callchain_nr * sizeof(u64);
/*
* Save the cookie for the deferred user callchain. The last 2
@@ -3434,7 +3437,7 @@ int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
data->branch_stack = (struct branch_stack *)array++;
if (data->branch_stack->nr > max_branch_nr)
- return -EFAULT;
+ goto out_efault;
sz = data->branch_stack->nr * sizeof(struct branch_entry);
if (evsel__has_branch_hw_idx(evsel)) {
@@ -3511,7 +3514,7 @@ int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
data->user_stack.size = *array++;
if (WARN_ONCE(data->user_stack.size > sz,
"user stack dump failure\n"))
- return -EFAULT;
+ goto out_efault;
}
}
@@ -3588,10 +3591,15 @@ int evsel__parse_sample(struct evsel *evsel, union perf_event *event,
array = (void *)array + sz;
}
- if (evsel__is_offcpu_event(evsel))
- return __set_offcpu_sample(data);
+ if (evsel__is_offcpu_event(evsel)) {
+ if (__set_offcpu_sample(data))
+ goto out_efault;
+ }
return 0;
+out_efault:
+ perf_sample__exit(data);
+ return -EFAULT;
}
int evsel__parse_sample_timestamp(struct evsel *evsel, union perf_event *event,
diff --git a/tools/perf/util/powerpc-vpadtl.c b/tools/perf/util/powerpc-vpadtl.c
index d1c3396f182f..993ab16614c7 100644
--- a/tools/perf/util/powerpc-vpadtl.c
+++ b/tools/perf/util/powerpc-vpadtl.c
@@ -182,7 +182,9 @@ static int powerpc_vpadtl_sample(struct powerpc_vpadtl_entry *record,
{
struct perf_sample sample;
union perf_event event;
+ int ret;
+ perf_sample__init(&sample, /*all=*/true);
sample.ip = be64_to_cpu(record->srr0);
sample.period = 1;
sample.cpu = cpu;
@@ -198,12 +200,12 @@ static int powerpc_vpadtl_sample(struct powerpc_vpadtl_entry *record,
event.sample.header.misc = sample.cpumode;
event.sample.header.size = sizeof(struct perf_event_header);
- if (perf_session__deliver_synth_event(vpa->session, &event, &sample)) {
+ ret = perf_session__deliver_synth_event(vpa->session, &event, &sample);
+ if (ret)
pr_debug("Failed to create sample for dtl entry\n");
- return -1;
- }
- return 0;
+ perf_sample__exit(&sample);
+ return ret;
}
static int powerpc_vpadtl_get_buffer(struct powerpc_vpadtl_queue *vpaq)
diff --git a/tools/perf/util/sample.c b/tools/perf/util/sample.c
index 8f82aaf1aab6..2a30de4573f6 100644
--- a/tools/perf/util/sample.c
+++ b/tools/perf/util/sample.c
@@ -21,13 +21,19 @@ void perf_sample__init(struct perf_sample *sample, bool all)
} else {
sample->user_regs = NULL;
sample->intr_regs = NULL;
+ sample->merged_callchain = false;
+ sample->callchain = NULL;
}
}
void perf_sample__exit(struct perf_sample *sample)
{
- free(sample->user_regs);
- free(sample->intr_regs);
+ zfree(&sample->user_regs);
+ zfree(&sample->intr_regs);
+ if (sample->merged_callchain) {
+ zfree(&sample->callchain);
+ sample->merged_callchain = false;
+ }
}
struct regs_dump *perf_sample__user_regs(struct perf_sample *sample)
diff --git a/tools/perf/util/sample.h b/tools/perf/util/sample.h
index 8d4ace0e6594..5809c42631e5 100644
--- a/tools/perf/util/sample.h
+++ b/tools/perf/util/sample.h
@@ -155,12 +155,6 @@ struct perf_sample {
* intel-pt. The instruction itself is held in insn.
*/
u16 insn_len;
- /**
- * @cpumode: The cpumode from struct perf_event_header misc variable
- * masked with CPUMODE_MASK. Gives user, kernel and hypervisor
- * information.
- */
- u8 cpumode;
/** @misc: The entire struct perf_event_header misc variable. */
u16 misc;
/**
@@ -174,6 +168,12 @@ struct perf_sample {
* powerpc holds p_stage_cyc.
*/
u16 weight3;
+ /**
+ * @cpumode: The cpumode from struct perf_event_header misc variable
+ * masked with CPUMODE_MASK. Gives user, kernel and hypervisor
+ * information.
+ */
+ u8 cpumode;
/**
* @no_hw_idx: For PERF_SAMPLE_BRANCH_STACK, true when
* PERF_SAMPLE_BRANCH_HW_INDEX isn't set.
@@ -184,6 +184,11 @@ struct perf_sample {
* user callchain marker was encountered.
*/
bool deferred_callchain;
+ /**
+ * @merged_callchain: A synthesized merged callchain that is allocated
+ * and needs freeing.
+ */
+ bool merged_callchain;
/**
* @deferred_cookie: Identifier of the deferred callchain in the later
* PERF_RECORD_CALLCHAIN_DEFERRED event.
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 3a911c70cd0e..53fb2e628b71 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1374,14 +1374,18 @@ static int evlist__deliver_deferred_callchain(struct evlist *evlist,
list_for_each_entry_safe(de, tmp, &evlist->deferred_samples, list) {
struct perf_sample orig_sample;
+ perf_sample__init(&orig_sample, /*all=*/false);
ret = evlist__parse_sample(evlist, de->event, &orig_sample);
if (ret < 0) {
pr_err("failed to parse original sample\n");
+ perf_sample__exit(&orig_sample);
break;
}
- if (sample->tid != orig_sample.tid)
+ if (sample->tid != orig_sample.tid) {
+ perf_sample__exit(&orig_sample);
continue;
+ }
if (event->callchain_deferred.cookie == orig_sample.deferred_cookie)
sample__merge_deferred_callchain(&orig_sample, sample);
@@ -1392,9 +1396,7 @@ static int evlist__deliver_deferred_callchain(struct evlist *evlist,
ret = evlist__deliver_sample(evlist, tool, de->event,
&orig_sample, evsel, machine);
- if (orig_sample.deferred_callchain)
- free(orig_sample.callchain);
-
+ perf_sample__exit(&orig_sample);
list_del(&de->list);
free(de->event);
free(de);
@@ -1421,9 +1423,11 @@ static int session__flush_deferred_samples(struct perf_session *session,
list_for_each_entry_safe(de, tmp, &evlist->deferred_samples, list) {
struct perf_sample sample;
+ perf_sample__init(&sample, /*all=*/false);
ret = evlist__parse_sample(evlist, de->event, &sample);
if (ret < 0) {
pr_err("failed to parse original sample\n");
+ perf_sample__exit(&sample);
break;
}
@@ -1431,6 +1435,7 @@ static int session__flush_deferred_samples(struct perf_session *session,
ret = evlist__deliver_sample(evlist, tool, de->event,
&sample, evsel, machine);
+ perf_sample__exit(&sample);
list_del(&de->list);
free(de->event);
free(de);
--
2.53.0.1213.gd9a14994de-goog
next prev parent reply other threads:[~2026-04-04 3:43 UTC|newest]
Thread overview: 172+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-09 17:40 [PATCH v1 00/25] perf tool: Add evsel to perf_sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 01/25] perf sample: Document struct perf_sample Ian Rogers
2026-03-03 3:07 ` Namhyung Kim
2026-03-20 4:41 ` Ian Rogers
2026-02-09 17:40 ` [PATCH v1 02/25] perf sample: Make sure perf_sample__init/exit are used Ian Rogers
2026-03-03 22:38 ` Namhyung Kim
2026-02-09 17:40 ` [PATCH v1 03/25] perf sample: Add evsel to struct perf_sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 04/25] perf tool: Remove evsel from tool APIs that pass the sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 05/25] perf kvm: Don't pass evsel with sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 06/25] perf evsel: Refactor evsel__intval to perf_sample__intval Ian Rogers
2026-02-09 17:40 ` [PATCH v1 07/25] perf trace: Don't pass evsel with sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 08/25] perf callchain: Don't pass evsel and sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 09/25] perf lock: Only pass sample to handlers Ian Rogers
2026-02-09 17:40 ` [PATCH v1 10/25] perf lock: Constify trace_lock_handler variables Ian Rogers
2026-02-09 17:40 ` [PATCH v1 11/25] perf hist: Remove evsel parameter from inc samples functions Ian Rogers
2026-02-09 17:40 ` [PATCH v1 12/25] perf db-export: Remove evsel from struct export_sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 13/25] perf hist: Remove evsel from struct hist_entry_iter Ian Rogers
2026-02-09 17:40 ` [PATCH v1 14/25] perf report: Directly use sample->evsel to avoid computing from sample->id Ian Rogers
2026-02-09 17:40 ` [PATCH v1 15/25] perf annotate: Don't pass evsel to add_sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 16/25] perf inject: Don't pass evsel with sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 17/25] perf kmem: " Ian Rogers
2026-02-09 17:40 ` [PATCH v1 18/25] perf kwork: " Ian Rogers
2026-02-09 17:40 ` [PATCH v1 19/25] perf sched: " Ian Rogers
2026-02-09 17:40 ` [PATCH v1 20/25] perf timechart: " Ian Rogers
2026-02-09 17:40 ` [PATCH v1 21/25] perf trace: " Ian Rogers
2026-02-09 17:40 ` [PATCH v1 22/25] perf evlist: Try to avoid computing evsel from sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 23/25] perf script: Don't pass evsel with sample Ian Rogers
2026-02-09 17:40 ` [PATCH v1 24/25] perf s390-sample-raw: " Ian Rogers
2026-02-09 17:40 ` [PATCH v1 25/25] perf evsel: " Ian Rogers
2026-02-23 19:15 ` [PATCH v1 00/25] perf tool: Add evsel to perf_sample Ian Rogers
2026-03-02 17:56 ` Ian Rogers
2026-03-03 1:15 ` Namhyung Kim
2026-03-04 1:02 ` Namhyung Kim
2026-03-04 16:19 ` Ian Rogers
2026-03-19 23:23 ` [PATCH v2 " Ian Rogers
2026-03-19 23:23 ` [PATCH v2 01/25] perf sample: Document struct perf_sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 02/25] perf sample: Make sure perf_sample__init/exit are used Ian Rogers
2026-03-19 23:23 ` [PATCH v2 03/25] perf sample: Add evsel to struct perf_sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 04/25] perf tool: Remove evsel from tool APIs that pass the sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 05/25] perf kvm: Don't pass evsel with sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 06/25] perf evsel: Refactor evsel__intval to perf_sample__intval Ian Rogers
2026-03-19 23:23 ` [PATCH v2 07/25] perf trace: Don't pass evsel with sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 08/25] perf callchain: Don't pass evsel and sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 09/25] perf lock: Only pass sample to handlers Ian Rogers
2026-03-19 23:23 ` [PATCH v2 10/25] perf lock: Constify trace_lock_handler variables Ian Rogers
2026-03-19 23:23 ` [PATCH v2 11/25] perf hist: Remove evsel parameter from inc samples functions Ian Rogers
2026-03-19 23:23 ` [PATCH v2 12/25] perf db-export: Remove evsel from struct export_sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 13/25] perf hist: Remove evsel from struct hist_entry_iter Ian Rogers
2026-03-19 23:23 ` [PATCH v2 14/25] perf report: Directly use sample->evsel to avoid computing from sample->id Ian Rogers
2026-03-19 23:23 ` [PATCH v2 15/25] perf annotate: Don't pass evsel to add_sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 16/25] perf inject: Don't pass evsel with sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 17/25] perf kmem: " Ian Rogers
2026-03-19 23:23 ` [PATCH v2 18/25] perf kwork: " Ian Rogers
2026-03-19 23:23 ` [PATCH v2 19/25] perf sched: " Ian Rogers
2026-03-19 23:23 ` [PATCH v2 20/25] perf timechart: " Ian Rogers
2026-03-19 23:23 ` [PATCH v2 21/25] perf trace: " Ian Rogers
2026-03-19 23:23 ` [PATCH v2 22/25] perf evlist: Try to avoid computing evsel from sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 23/25] perf script: Don't pass evsel with sample Ian Rogers
2026-03-19 23:23 ` [PATCH v2 24/25] perf s390-sample-raw: " Ian Rogers
2026-03-19 23:23 ` [PATCH v2 25/25] perf evsel: " Ian Rogers
2026-03-20 8:08 ` [PATCH v3 00/25] perf tool: Add evsel to perf_sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 01/25] perf sample: Document struct perf_sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 02/25] perf sample: Make sure perf_sample__init/exit are used Ian Rogers
2026-03-20 8:08 ` [PATCH v3 03/25] perf sample: Add evsel to struct perf_sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 04/25] perf tool: Remove evsel from tool APIs that pass the sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 05/25] perf kvm: Don't pass evsel with sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 06/25] perf evsel: Refactor evsel__intval to perf_sample__intval Ian Rogers
2026-03-20 8:08 ` [PATCH v3 07/25] perf trace: Don't pass evsel with sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 08/25] perf callchain: Don't pass evsel and sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 09/25] perf lock: Only pass sample to handlers Ian Rogers
2026-03-20 8:08 ` [PATCH v3 10/25] perf lock: Constify trace_lock_handler variables Ian Rogers
2026-03-20 8:08 ` [PATCH v3 11/25] perf hist: Remove evsel parameter from inc samples functions Ian Rogers
2026-03-20 8:08 ` [PATCH v3 12/25] perf db-export: Remove evsel from struct export_sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 13/25] perf hist: Remove evsel from struct hist_entry_iter Ian Rogers
2026-03-20 8:08 ` [PATCH v3 14/25] perf report: Directly use sample->evsel to avoid computing from sample->id Ian Rogers
2026-03-20 8:08 ` [PATCH v3 15/25] perf annotate: Don't pass evsel to add_sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 16/25] perf inject: Don't pass evsel with sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 17/25] perf kmem: " Ian Rogers
2026-03-20 8:08 ` [PATCH v3 18/25] perf kwork: " Ian Rogers
2026-03-20 8:08 ` [PATCH v3 19/25] perf sched: " Ian Rogers
2026-03-20 8:08 ` [PATCH v3 20/25] perf timechart: " Ian Rogers
2026-03-20 8:08 ` [PATCH v3 21/25] perf trace: " Ian Rogers
2026-03-20 8:08 ` [PATCH v3 22/25] perf evlist: Try to avoid computing evsel from sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 23/25] perf script: Don't pass evsel with sample Ian Rogers
2026-03-20 8:08 ` [PATCH v3 24/25] perf s390-sample-raw: " Ian Rogers
2026-03-20 8:08 ` [PATCH v3 25/25] perf evsel: " Ian Rogers
2026-03-20 19:26 ` [PATCH v4 00/25] perf tool: Add evsel to perf_sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 01/25] perf sample: Document struct perf_sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 02/25] perf sample: Make sure perf_sample__init/exit are used Ian Rogers
2026-04-03 3:10 ` Namhyung Kim
2026-04-03 15:56 ` Ian Rogers
2026-03-20 19:26 ` [PATCH v4 03/25] perf sample: Add evsel to struct perf_sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 04/25] perf tool: Remove evsel from tool APIs that pass the sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 05/25] perf kvm: Don't pass evsel with sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 06/25] perf evsel: Refactor evsel__intval to perf_sample__intval Ian Rogers
2026-03-20 19:26 ` [PATCH v4 07/25] perf trace: Don't pass evsel with sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 08/25] perf callchain: Don't pass evsel and sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 09/25] perf lock: Only pass sample to handlers Ian Rogers
2026-03-20 19:26 ` [PATCH v4 10/25] perf lock: Constify trace_lock_handler variables Ian Rogers
2026-03-20 19:26 ` [PATCH v4 11/25] perf hist: Remove evsel parameter from inc samples functions Ian Rogers
2026-03-20 19:26 ` [PATCH v4 12/25] perf db-export: Remove evsel from struct export_sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 13/25] perf hist: Remove evsel from struct hist_entry_iter Ian Rogers
2026-03-20 19:26 ` [PATCH v4 14/25] perf report: Directly use sample->evsel to avoid computing from sample->id Ian Rogers
2026-03-20 19:26 ` [PATCH v4 15/25] perf annotate: Don't pass evsel to add_sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 16/25] perf inject: Don't pass evsel with sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 17/25] perf kmem: " Ian Rogers
2026-03-20 19:26 ` [PATCH v4 18/25] perf kwork: " Ian Rogers
2026-03-20 19:26 ` [PATCH v4 19/25] perf sched: " Ian Rogers
2026-03-20 19:26 ` [PATCH v4 20/25] perf timechart: " Ian Rogers
2026-03-20 19:26 ` [PATCH v4 21/25] perf trace: " Ian Rogers
2026-03-20 19:26 ` [PATCH v4 22/25] perf evlist: Try to avoid computing evsel from sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 23/25] perf script: Don't pass evsel with sample Ian Rogers
2026-03-20 19:26 ` [PATCH v4 24/25] perf s390-sample-raw: Don't pass evsel or its PMU " Ian Rogers
2026-03-20 19:26 ` [PATCH v4 25/25] perf evsel: Don't pass evsel " Ian Rogers
2026-04-01 5:57 ` [PATCH v4 00/25] perf tool: Add evsel to perf_sample Ian Rogers
2026-04-03 20:39 ` [PATCH v5 " Ian Rogers
2026-04-03 20:39 ` [PATCH v5 01/25] perf sample: Document struct perf_sample Ian Rogers
2026-04-03 20:39 ` [PATCH v5 02/25] perf sample: Make sure perf_sample__init/exit are used Ian Rogers
2026-04-03 20:39 ` [PATCH v5 03/25] perf sample: Add evsel to struct perf_sample Ian Rogers
2026-04-03 20:39 ` [PATCH v5 04/25] perf tool: Remove evsel from tool APIs that pass the sample Ian Rogers
2026-04-03 20:39 ` [PATCH v5 05/25] perf kvm: Don't pass evsel with sample Ian Rogers
2026-04-03 20:39 ` [PATCH v5 06/25] perf evsel: Refactor evsel tracepoint sample accessors perf_sample Ian Rogers
2026-04-03 20:39 ` [PATCH v5 07/25] perf trace: Don't pass evsel with sample Ian Rogers
2026-04-03 20:40 ` [PATCH v5 08/25] perf callchain: Don't pass evsel and sample Ian Rogers
2026-04-03 20:40 ` [PATCH v5 09/25] perf lock: Only pass sample to handlers Ian Rogers
2026-04-03 20:40 ` [PATCH v5 10/25] perf lock: Constify trace_lock_handler variables Ian Rogers
2026-04-03 20:40 ` [PATCH v5 11/25] perf hist: Remove evsel parameter from inc samples functions Ian Rogers
2026-04-03 20:40 ` [PATCH v5 12/25] perf db-export: Remove evsel from struct export_sample Ian Rogers
2026-04-03 20:40 ` [PATCH v5 13/25] perf hist: Remove evsel from struct hist_entry_iter Ian Rogers
2026-04-03 20:40 ` [PATCH v5 14/25] perf report: Directly use sample->evsel to avoid computing from sample->id Ian Rogers
2026-04-03 20:40 ` [PATCH v5 15/25] perf annotate: Don't pass evsel to add_sample Ian Rogers
2026-04-03 20:40 ` [PATCH v5 16/25] perf inject: Don't pass evsel with sample Ian Rogers
2026-04-03 20:40 ` [PATCH v5 17/25] perf kmem: " Ian Rogers
2026-04-03 20:40 ` [PATCH v5 18/25] perf kwork: " Ian Rogers
2026-04-03 20:40 ` [PATCH v5 19/25] perf sched: " Ian Rogers
2026-04-03 20:40 ` [PATCH v5 20/25] perf timechart: " Ian Rogers
2026-04-03 20:40 ` [PATCH v5 21/25] perf trace: " Ian Rogers
2026-04-03 20:40 ` [PATCH v5 22/25] perf evlist: Try to avoid computing evsel from sample Ian Rogers
2026-04-03 20:40 ` [PATCH v5 23/25] perf script: Don't pass evsel with sample Ian Rogers
2026-04-03 20:40 ` [PATCH v5 24/25] perf s390-sample-raw: Don't pass evsel or its PMU " Ian Rogers
2026-04-03 20:40 ` [PATCH v5 25/25] perf evsel: Don't pass evsel " Ian Rogers
2026-04-04 3:43 ` [PATCH v6 00/25] perf tool: Add evsel to perf_sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 01/25] perf sample: Document struct perf_sample Ian Rogers
2026-04-04 3:43 ` Ian Rogers [this message]
2026-04-04 3:43 ` [PATCH v6 03/25] perf sample: Add evsel to " Ian Rogers
2026-04-04 3:43 ` [PATCH v6 04/25] perf tool: Remove evsel from tool APIs that pass the sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 05/25] perf kvm: Don't pass evsel with sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 06/25] perf evsel: Refactor evsel tracepoint sample accessors perf_sample Ian Rogers
2026-04-06 6:06 ` Namhyung Kim
2026-04-06 15:24 ` Ian Rogers
2026-04-06 18:12 ` Namhyung Kim
2026-04-04 3:43 ` [PATCH v6 07/25] perf trace: Don't pass evsel with sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 08/25] perf callchain: Don't pass evsel and sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 09/25] perf lock: Only pass sample to handlers Ian Rogers
2026-04-04 3:43 ` [PATCH v6 10/25] perf lock: Constify trace_lock_handler variables Ian Rogers
2026-04-04 3:43 ` [PATCH v6 11/25] perf hist: Remove evsel parameter from inc samples functions Ian Rogers
2026-04-04 3:43 ` [PATCH v6 12/25] perf db-export: Remove evsel from struct export_sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 13/25] perf hist: Remove evsel from struct hist_entry_iter Ian Rogers
2026-04-04 3:43 ` [PATCH v6 14/25] perf report: Directly use sample->evsel to avoid computing from sample->id Ian Rogers
2026-04-04 3:43 ` [PATCH v6 15/25] perf annotate: Don't pass evsel to add_sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 16/25] perf inject: Don't pass evsel with sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 17/25] perf kmem: " Ian Rogers
2026-04-04 3:43 ` [PATCH v6 18/25] perf kwork: " Ian Rogers
2026-04-04 3:43 ` [PATCH v6 19/25] perf sched: " Ian Rogers
2026-04-04 3:43 ` [PATCH v6 20/25] perf timechart: " Ian Rogers
2026-04-04 3:43 ` [PATCH v6 21/25] perf trace: " Ian Rogers
2026-04-04 3:43 ` [PATCH v6 22/25] perf evlist: Try to avoid computing evsel from sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 23/25] perf script: Don't pass evsel with sample Ian Rogers
2026-04-04 3:43 ` [PATCH v6 24/25] perf s390-sample-raw: Don't pass evsel or its PMU " Ian Rogers
2026-04-04 3:43 ` [PATCH v6 25/25] perf evsel: Don't pass evsel " Ian Rogers
2026-04-06 6:11 ` [PATCH v6 00/25] perf tool: Add evsel to perf_sample Namhyung Kim
2026-04-06 17:50 ` Namhyung Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260404034325.3172592-3-irogers@google.com \
--to=irogers@google.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ajones@ventanamicro.com \
--cc=ak@linux.intel.com \
--cc=alex@ghiti.fr \
--cc=alexander.shishkin@linux.intel.com \
--cc=anup@brainfault.org \
--cc=aou@eecs.berkeley.edu \
--cc=atrajeev@linux.ibm.com \
--cc=blakejones@google.com \
--cc=ctshao@google.com \
--cc=dapeng1.mi@linux.intel.com \
--cc=derek.foreman@collabora.com \
--cc=dvyukov@google.com \
--cc=howardchu95@gmail.com \
--cc=hrishikesh123s@gmail.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=krzysztof.m.lopatowski@gmail.com \
--cc=leo.yan@arm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=linux@treblig.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=nichen@iscas.ac.cn \
--cc=palmer@dabbelt.com \
--cc=peterz@infradead.org \
--cc=pjw@kernel.org \
--cc=ravi.bangoria@amd.com \
--cc=swapnil.sapkal@amd.com \
--cc=tanze@kylinos.cn \
--cc=thomas.falcon@intel.com \
--cc=tianyou.li@intel.com \
--cc=yujie.liu@intel.com \
--cc=zhouquan@iscas.ac.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox