[PATCH v10 07/29] perf lock: Only pass sample to handlers
From: Ian Rogers
Date: Sat Apr 11 2026 - 22:14:41 EST
The evsel is within the sample and so only the sample needs to be
passed. Remove the parameter and fix call site.
Add an additional NULL check in get_callstack, as prompted by Sashiko
during review.
Signed-off-by: Ian Rogers <irogers@xxxxxxxxxx>
---
tools/perf/builtin-lock.c | 76 ++++++++++++++++++---------------------
1 file changed, 35 insertions(+), 41 deletions(-)
diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
index e2b585e528ac..fcc33089b945 100644
--- a/tools/perf/builtin-lock.c
+++ b/tools/perf/builtin-lock.c
@@ -473,28 +473,22 @@ static struct lock_stat *pop_from_result(void)
struct trace_lock_handler {
/* it's used on CONFIG_LOCKDEP */
- int (*acquire_event)(struct evsel *evsel,
- struct perf_sample *sample);
+ int (*acquire_event)(struct perf_sample *sample);
/* it's used on CONFIG_LOCKDEP && CONFIG_LOCK_STAT */
- int (*acquired_event)(struct evsel *evsel,
- struct perf_sample *sample);
+ int (*acquired_event)(struct perf_sample *sample);
/* it's used on CONFIG_LOCKDEP && CONFIG_LOCK_STAT */
- int (*contended_event)(struct evsel *evsel,
- struct perf_sample *sample);
+ int (*contended_event)(struct perf_sample *sample);
/* it's used on CONFIG_LOCKDEP */
- int (*release_event)(struct evsel *evsel,
- struct perf_sample *sample);
+ int (*release_event)(struct perf_sample *sample);
/* it's used when CONFIG_LOCKDEP is off */
- int (*contention_begin_event)(struct evsel *evsel,
- struct perf_sample *sample);
+ int (*contention_begin_event)(struct perf_sample *sample);
/* it's used when CONFIG_LOCKDEP is off */
- int (*contention_end_event)(struct evsel *evsel,
- struct perf_sample *sample);
+ int (*contention_end_event)(struct perf_sample *sample);
};
static struct lock_seq_stat *get_seq(struct thread_stat *ts, u64 addr)
@@ -563,8 +557,7 @@ static int get_key_by_aggr_mode(u64 *key, u64 addr,
return get_key_by_aggr_mode_simple(key, addr, sample->tid);
}
-static int report_lock_acquire_event(struct evsel *evsel __maybe_unused,
- struct perf_sample *sample)
+static int report_lock_acquire_event(struct perf_sample *sample)
{
struct lock_stat *ls;
struct thread_stat *ts;
@@ -638,8 +631,7 @@ static int report_lock_acquire_event(struct evsel *evsel __maybe_unused,
return 0;
}
-static int report_lock_acquired_event(struct evsel *evsel __maybe_unused,
- struct perf_sample *sample)
+static int report_lock_acquired_event(struct perf_sample *sample)
{
struct lock_stat *ls;
struct thread_stat *ts;
@@ -704,8 +696,7 @@ static int report_lock_acquired_event(struct evsel *evsel __maybe_unused,
return 0;
}
-static int report_lock_contended_event(struct evsel *evsel __maybe_unused,
- struct perf_sample *sample)
+static int report_lock_contended_event(struct perf_sample *sample)
{
struct lock_stat *ls;
struct thread_stat *ts;
@@ -762,8 +753,7 @@ static int report_lock_contended_event(struct evsel *evsel __maybe_unused,
return 0;
}
-static int report_lock_release_event(struct evsel *evsel __maybe_unused,
- struct perf_sample *sample)
+static int report_lock_release_event(struct perf_sample *sample)
{
struct lock_stat *ls;
struct thread_stat *ts;
@@ -948,9 +938,16 @@ static u64 *get_callstack(struct perf_sample *sample, int max_stack)
u64 i;
int c;
+ if (!sample->callchain) {
+ pr_debug("Sample unexpectedly missing callchain\n");
+ return NULL;
+ }
+
callstack = calloc(max_stack, sizeof(*callstack));
- if (callstack == NULL)
+ if (callstack == NULL) {
+ pr_debug("Failed to allocate callstack\n");
return NULL;
+ }
for (i = 0, c = 0; i < sample->callchain->nr && c < max_stack; i++) {
u64 ip = sample->callchain->ips[i];
@@ -963,8 +960,7 @@ static u64 *get_callstack(struct perf_sample *sample, int max_stack)
return callstack;
}
-static int report_lock_contention_begin_event(struct evsel *evsel __maybe_unused,
- struct perf_sample *sample)
+static int report_lock_contention_begin_event(struct perf_sample *sample)
{
struct lock_stat *ls;
struct thread_stat *ts;
@@ -1070,7 +1066,7 @@ static int report_lock_contention_begin_event(struct evsel *evsel __maybe_unused
if (needs_callstack()) {
u64 *callstack = get_callstack(sample, max_stack_depth);
if (callstack == NULL)
- return -ENOMEM;
+ return 0;
if (!match_callstack_filter(machine, callstack, max_stack_depth)) {
free(callstack);
@@ -1127,8 +1123,7 @@ static int report_lock_contention_begin_event(struct evsel *evsel __maybe_unused
return 0;
}
-static int report_lock_contention_end_event(struct evsel *evsel __maybe_unused,
- struct perf_sample *sample)
+static int report_lock_contention_end_event(struct perf_sample *sample)
{
struct lock_stat *ls;
struct thread_stat *ts;
@@ -1208,45 +1203,45 @@ static struct trace_lock_handler contention_lock_ops = {
static struct trace_lock_handler *trace_handler;
-static int evsel__process_lock_acquire(struct evsel *evsel, struct perf_sample *sample)
+static int evsel__process_lock_acquire(struct perf_sample *sample)
{
if (trace_handler->acquire_event)
- return trace_handler->acquire_event(evsel, sample);
+ return trace_handler->acquire_event(sample);
return 0;
}
-static int evsel__process_lock_acquired(struct evsel *evsel, struct perf_sample *sample)
+static int evsel__process_lock_acquired(struct perf_sample *sample)
{
if (trace_handler->acquired_event)
- return trace_handler->acquired_event(evsel, sample);
+ return trace_handler->acquired_event(sample);
return 0;
}
-static int evsel__process_lock_contended(struct evsel *evsel, struct perf_sample *sample)
+static int evsel__process_lock_contended(struct perf_sample *sample)
{
if (trace_handler->contended_event)
- return trace_handler->contended_event(evsel, sample);
+ return trace_handler->contended_event(sample);
return 0;
}
-static int evsel__process_lock_release(struct evsel *evsel, struct perf_sample *sample)
+static int evsel__process_lock_release(struct perf_sample *sample)
{
if (trace_handler->release_event)
- return trace_handler->release_event(evsel, sample);
+ return trace_handler->release_event(sample);
return 0;
}
-static int evsel__process_contention_begin(struct evsel *evsel, struct perf_sample *sample)
+static int evsel__process_contention_begin(struct perf_sample *sample)
{
if (trace_handler->contention_begin_event)
- return trace_handler->contention_begin_event(evsel, sample);
+ return trace_handler->contention_begin_event(sample);
return 0;
}
-static int evsel__process_contention_end(struct evsel *evsel, struct perf_sample *sample)
+static int evsel__process_contention_end(struct perf_sample *sample)
{
if (trace_handler->contention_end_event)
- return trace_handler->contention_end_event(evsel, sample);
+ return trace_handler->contention_end_event(sample);
return 0;
}
@@ -1424,8 +1419,7 @@ static int process_event_update(const struct perf_tool *tool,
return 0;
}
-typedef int (*tracepoint_handler)(struct evsel *evsel,
- struct perf_sample *sample);
+typedef int (*tracepoint_handler)(struct perf_sample *sample);
static int process_sample_event(const struct perf_tool *tool __maybe_unused,
union perf_event *event,
@@ -1445,7 +1439,7 @@ static int process_sample_event(const struct perf_tool *tool __maybe_unused,
if (evsel->handler != NULL) {
tracepoint_handler f = evsel->handler;
- err = f(evsel, sample);
+ err = f(sample);
}
thread__put(thread);
--
2.53.0.1213.gd9a14994de-goog