From: Tao Chen <chen.dylane@linux.dev>
To: peterz@infradead.org, mingo@redhat.com, acme@kernel.org,
namhyung@kernel.org, mark.rutland@arm.com,
alexander.shishkin@linux.intel.com, jolsa@kernel.org,
irogers@google.com, adrian.hunter@intel.com,
kan.liang@linux.intel.com, song@kernel.org, ast@kernel.org,
daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev,
eddyz87@gmail.com, yonghong.song@linux.dev,
john.fastabend@gmail.com, kpsingh@kernel.org, sdf@fomichev.me,
haoluo@google.com
Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
bpf@vger.kernel.org, Tao Chen <chen.dylane@linux.dev>
Subject: [PATCH bpf-next v8 1/3] perf: Add rctx in perf_callchain_entry
Date: Mon, 26 Jan 2026 15:43:29 +0800 [thread overview]
Message-ID: <20260126074331.815684-2-chen.dylane@linux.dev> (raw)
In-Reply-To: <20260126074331.815684-1-chen.dylane@linux.dev>
Record rctx inside the perf_callchain_entry itself, when callers of
get_callchain_entry no longer care about the assignment of rctx, and
will be used in the next patch.
Suggested-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Tao Chen <chen.dylane@linux.dev>
---
include/linux/perf_event.h | 5 +++--
kernel/bpf/stackmap.c | 5 ++---
kernel/events/callchain.c | 27 ++++++++++++++++-----------
3 files changed, 21 insertions(+), 16 deletions(-)
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 9870d768db4..f0489843ebc 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -57,6 +57,7 @@
#include <asm/local.h>
struct perf_callchain_entry {
+ int rctx;
u64 nr;
u64 ip[]; /* /proc/sys/kernel/perf_event_max_stack */
};
@@ -1723,8 +1724,8 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
u32 max_stack, bool crosstask, bool add_mark, u64 defer_cookie);
extern int get_callchain_buffers(int max_stack);
extern void put_callchain_buffers(void);
-extern struct perf_callchain_entry *get_callchain_entry(int *rctx);
-extern void put_callchain_entry(int rctx);
+extern struct perf_callchain_entry *get_callchain_entry(void);
+extern void put_callchain_entry(struct perf_callchain_entry *entry);
extern int sysctl_perf_event_max_stack;
extern int sysctl_perf_event_max_contexts_per_stack;
diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c
index da3d328f5c1..e77dcdc2164 100644
--- a/kernel/bpf/stackmap.c
+++ b/kernel/bpf/stackmap.c
@@ -214,9 +214,8 @@ get_callchain_entry_for_task(struct task_struct *task, u32 max_depth)
{
#ifdef CONFIG_STACKTRACE
struct perf_callchain_entry *entry;
- int rctx;
- entry = get_callchain_entry(&rctx);
+ entry = get_callchain_entry();
if (!entry)
return NULL;
@@ -238,7 +237,7 @@ get_callchain_entry_for_task(struct task_struct *task, u32 max_depth)
to[i] = (u64)(from[i]);
}
- put_callchain_entry(rctx);
+ put_callchain_entry(entry);
return entry;
#else /* CONFIG_STACKTRACE */
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c
index b9c7e00725d..6cdbc5937b1 100644
--- a/kernel/events/callchain.c
+++ b/kernel/events/callchain.c
@@ -151,31 +151,36 @@ void put_callchain_buffers(void)
}
}
-struct perf_callchain_entry *get_callchain_entry(int *rctx)
+struct perf_callchain_entry *get_callchain_entry(void)
{
int cpu;
+ int rctx;
struct callchain_cpus_entries *entries;
+ struct perf_callchain_entry *entry;
- *rctx = get_recursion_context(this_cpu_ptr(callchain_recursion));
- if (*rctx == -1)
+ rctx = get_recursion_context(this_cpu_ptr(callchain_recursion));
+ if (rctx == -1)
return NULL;
entries = rcu_dereference(callchain_cpus_entries);
if (!entries) {
- put_recursion_context(this_cpu_ptr(callchain_recursion), *rctx);
+ put_recursion_context(this_cpu_ptr(callchain_recursion), rctx);
return NULL;
}
cpu = smp_processor_id();
- return (((void *)entries->cpu_entries[cpu]) +
- (*rctx * perf_callchain_entry__sizeof()));
+ entry = ((void *)entries->cpu_entries[cpu]) +
+ (rctx * perf_callchain_entry__sizeof());
+ entry->rctx = rctx;
+
+ return entry;
}
void
-put_callchain_entry(int rctx)
+put_callchain_entry(struct perf_callchain_entry *entry)
{
- put_recursion_context(this_cpu_ptr(callchain_recursion), rctx);
+ put_recursion_context(this_cpu_ptr(callchain_recursion), entry->rctx);
}
static void fixup_uretprobe_trampoline_entries(struct perf_callchain_entry *entry,
@@ -222,13 +227,13 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
{
struct perf_callchain_entry *entry;
struct perf_callchain_entry_ctx ctx;
- int rctx, start_entry_idx;
+ int start_entry_idx;
/* crosstask is not supported for user stacks */
if (crosstask && user && !kernel)
return NULL;
- entry = get_callchain_entry(&rctx);
+ entry = get_callchain_entry();
if (!entry)
return NULL;
@@ -272,7 +277,7 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
}
exit_put:
- put_callchain_entry(rctx);
+ put_callchain_entry(entry);
return entry;
}
--
2.48.1
next prev parent reply other threads:[~2026-01-26 7:45 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-26 7:43 [PATCH bpf-next v8 0/3] Pass external callchain entry to get_perf_callchain Tao Chen
2026-01-26 7:43 ` Tao Chen [this message]
2026-01-26 8:03 ` [PATCH bpf-next v8 1/3] perf: Add rctx in perf_callchain_entry bot+bpf-ci
2026-01-26 8:51 ` Tao Chen
2026-01-27 21:01 ` Andrii Nakryiko
2026-01-28 2:41 ` Tao Chen
2026-01-28 8:59 ` Peter Zijlstra
2026-01-28 16:52 ` Tao Chen
2026-01-28 18:59 ` Andrii Nakryiko
2026-01-29 3:03 ` Tao Chen
2026-01-26 7:43 ` [PATCH bpf-next v8 2/3] perf: Refactor get_perf_callchain Tao Chen
2026-01-27 21:07 ` Andrii Nakryiko
2026-01-28 2:42 ` Tao Chen
2026-01-28 9:10 ` Peter Zijlstra
2026-01-28 16:49 ` Tao Chen
2026-01-28 19:12 ` Andrii Nakryiko
2026-01-30 11:31 ` Peter Zijlstra
2026-01-30 20:04 ` Andrii Nakryiko
2026-02-02 19:59 ` Peter Zijlstra
2026-02-04 0:24 ` Andrii Nakryiko
2026-02-04 1:08 ` Andrii Nakryiko
2026-02-05 6:16 ` Tao Chen
2026-02-05 17:34 ` Andrii Nakryiko
2026-02-06 9:20 ` Tao Chen
2026-01-26 7:43 ` [PATCH bpf-next v8 3/3] bpf: Hold ther perf callchain entry until used completely Tao Chen
2026-01-27 21:35 ` Andrii Nakryiko
2026-01-28 4:21 ` Tao Chen
2026-01-28 19:13 ` Andrii Nakryiko
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=20260126074331.815684-2-chen.dylane@linux.dev \
--to=chen.dylane@linux.dev \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=irogers@google.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=kpsingh@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=martin.lau@linux.dev \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=sdf@fomichev.me \
--cc=song@kernel.org \
--cc=yonghong.song@linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.