* [RESEND][PATCH 0/5] perf: Clean ups and simplifications
@ 2025-08-20 18:03 Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 1/5] perf: Remove get_perf_callchain() init_nr argument Steven Rostedt
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Steven Rostedt @ 2025-08-20 18:03 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel, linux-perf-users
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, Liang, Kan, Thomas Gleixner
This is a resend from: https://lore.kernel.org/linux-trace-kernel/20250717173125.434618999@kernel.org/
It cleanly applied on top of the latest tip/perf/core:
448f97fba901 ("perf: Convert mmap() refcounts to refcount_t")
The ongoing work to support sframes[1] in the kernel required a few clean ups
to the perf kernel side. Instead of having these changes in the ongoing
work, there's no reason they cannot be applied now.
These are just clean ups to the perf code to help simplify the updates that
will be made later.
[1] https://lore.kernel.org/linux-trace-kernel/20250708020003.565862284@kernel.org
Josh Poimboeuf (4):
perf: Remove get_perf_callchain() init_nr argument
perf: Have get_perf_callchain() return NULL if crosstask and user are set
perf: Simplify get_perf_callchain() user logic
perf: Skip user unwind if the task is a kernel thread
Steven Rostedt (1):
perf: Use current->flags & PF_KTHREAD|PF_USER_WORKER instead of current->mm == NULL
----
include/linux/perf_event.h | 2 +-
kernel/bpf/stackmap.c | 4 ++--
kernel/events/callchain.c | 40 +++++++++++++++++++---------------------
kernel/events/core.c | 9 +++++----
4 files changed, 27 insertions(+), 28 deletions(-)
^ permalink raw reply [flat|nested] 7+ messages in thread
* [RESEND][PATCH 1/5] perf: Remove get_perf_callchain() init_nr argument
2025-08-20 18:03 [RESEND][PATCH 0/5] perf: Clean ups and simplifications Steven Rostedt
@ 2025-08-20 18:03 ` Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 2/5] perf: Have get_perf_callchain() return NULL if crosstask and user are set Steven Rostedt
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Steven Rostedt @ 2025-08-20 18:03 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel, linux-perf-users
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, Liang, Kan, Thomas Gleixner, Namhyung Kim,
Alexei Starovoitov, Josh Poimboeuf
From: Josh Poimboeuf <jpoimboe@kernel.org>
The 'init_nr' argument has double duty: it's used to initialize both the
number of contexts and the number of stack entries. That's confusing
and the callers always pass zero anyway. Hard code the zero.
Acked-by: Namhyung Kim <Namhyung@kernel.org>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
include/linux/perf_event.h | 2 +-
kernel/bpf/stackmap.c | 4 ++--
kernel/events/callchain.c | 12 ++++++------
kernel/events/core.c | 2 +-
4 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index bfbf9ea53f25..fd1d91017b99 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -1719,7 +1719,7 @@ DECLARE_PER_CPU(struct perf_callchain_entry, perf_callchain_entry);
extern void perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs);
extern void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs);
extern struct perf_callchain_entry *
-get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user,
+get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
u32 max_stack, bool crosstask, bool add_mark);
extern int get_callchain_buffers(int max_stack);
extern void put_callchain_buffers(void);
diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c
index 3615c06b7dfa..ec3a57a5fba1 100644
--- a/kernel/bpf/stackmap.c
+++ b/kernel/bpf/stackmap.c
@@ -314,7 +314,7 @@ BPF_CALL_3(bpf_get_stackid, struct pt_regs *, regs, struct bpf_map *, map,
if (max_depth > sysctl_perf_event_max_stack)
max_depth = sysctl_perf_event_max_stack;
- trace = get_perf_callchain(regs, 0, kernel, user, max_depth,
+ trace = get_perf_callchain(regs, kernel, user, max_depth,
false, false);
if (unlikely(!trace))
@@ -451,7 +451,7 @@ static long __bpf_get_stack(struct pt_regs *regs, struct task_struct *task,
else if (kernel && task)
trace = get_callchain_entry_for_task(task, max_depth);
else
- trace = get_perf_callchain(regs, 0, kernel, user, max_depth,
+ trace = get_perf_callchain(regs, kernel, user, max_depth,
crosstask, false);
if (unlikely(!trace) || trace->nr < skip) {
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c
index 6c83ad674d01..b0f5bd228cd8 100644
--- a/kernel/events/callchain.c
+++ b/kernel/events/callchain.c
@@ -217,7 +217,7 @@ static void fixup_uretprobe_trampoline_entries(struct perf_callchain_entry *entr
}
struct perf_callchain_entry *
-get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user,
+get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
u32 max_stack, bool crosstask, bool add_mark)
{
struct perf_callchain_entry *entry;
@@ -228,11 +228,11 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user,
if (!entry)
return NULL;
- ctx.entry = entry;
- ctx.max_stack = max_stack;
- ctx.nr = entry->nr = init_nr;
- ctx.contexts = 0;
- ctx.contexts_maxed = false;
+ ctx.entry = entry;
+ ctx.max_stack = max_stack;
+ ctx.nr = entry->nr = 0;
+ ctx.contexts = 0;
+ ctx.contexts_maxed = false;
if (kernel && !user_mode(regs)) {
if (add_mark)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index ea357044d780..bade8e0fced7 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -8210,7 +8210,7 @@ perf_callchain(struct perf_event *event, struct pt_regs *regs)
if (!kernel && !user)
return &__empty_callchain;
- callchain = get_perf_callchain(regs, 0, kernel, user,
+ callchain = get_perf_callchain(regs, kernel, user,
max_stack, crosstask, true);
return callchain ?: &__empty_callchain;
}
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RESEND][PATCH 2/5] perf: Have get_perf_callchain() return NULL if crosstask and user are set
2025-08-20 18:03 [RESEND][PATCH 0/5] perf: Clean ups and simplifications Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 1/5] perf: Remove get_perf_callchain() init_nr argument Steven Rostedt
@ 2025-08-20 18:03 ` Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 3/5] perf: Use current->flags & PF_KTHREAD|PF_USER_WORKER instead of current->mm == NULL Steven Rostedt
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Steven Rostedt @ 2025-08-20 18:03 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel, linux-perf-users
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, Liang, Kan, Thomas Gleixner, Josh Poimboeuf
From: Josh Poimboeuf <jpoimboe@kernel.org>
get_perf_callchain() doesn't support cross-task unwinding for user space
stacks, have it return NULL if both the crosstask and user arguments are
set.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/events/callchain.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c
index b0f5bd228cd8..cd0e3fc7ed05 100644
--- a/kernel/events/callchain.c
+++ b/kernel/events/callchain.c
@@ -224,6 +224,10 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
struct perf_callchain_entry_ctx ctx;
int rctx, start_entry_idx;
+ /* crosstask is not supported for user stacks */
+ if (crosstask && user && !kernel)
+ return NULL;
+
entry = get_callchain_entry(&rctx);
if (!entry)
return NULL;
@@ -240,7 +244,7 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
perf_callchain_kernel(&ctx, regs);
}
- if (user) {
+ if (user && !crosstask) {
if (!user_mode(regs)) {
if (current->mm)
regs = task_pt_regs(current);
@@ -249,9 +253,6 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
}
if (regs) {
- if (crosstask)
- goto exit_put;
-
if (add_mark)
perf_callchain_store_context(&ctx, PERF_CONTEXT_USER);
@@ -261,7 +262,6 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
}
}
-exit_put:
put_callchain_entry(rctx);
return entry;
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RESEND][PATCH 3/5] perf: Use current->flags & PF_KTHREAD|PF_USER_WORKER instead of current->mm == NULL
2025-08-20 18:03 [RESEND][PATCH 0/5] perf: Clean ups and simplifications Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 1/5] perf: Remove get_perf_callchain() init_nr argument Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 2/5] perf: Have get_perf_callchain() return NULL if crosstask and user are set Steven Rostedt
@ 2025-08-20 18:03 ` Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 4/5] perf: Simplify get_perf_callchain() user logic Steven Rostedt
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Steven Rostedt @ 2025-08-20 18:03 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel, linux-perf-users
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, Liang, Kan, Thomas Gleixner
From: Steven Rostedt <rostedt@goodmis.org>
To determine if a task is a kernel thread or not, it is more reliable to
use (current->flags & (PF_KTHREAD|PF_USER_WORKERi)) than to rely on
current->mm being NULL. That is because some kernel tasks (io_uring
helpers) may have a mm field.
Link: https://lore.kernel.org/linux-trace-kernel/20250424163607.GE18306@noisy.programming.kicks-ass.net/
Link: https://lore.kernel.org/all/20250624130744.602c5b5f@batman.local.home/
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/events/callchain.c | 6 +++---
kernel/events/core.c | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c
index cd0e3fc7ed05..5982d18f169b 100644
--- a/kernel/events/callchain.c
+++ b/kernel/events/callchain.c
@@ -246,10 +246,10 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
if (user && !crosstask) {
if (!user_mode(regs)) {
- if (current->mm)
- regs = task_pt_regs(current);
- else
+ if (current->flags & (PF_KTHREAD | PF_USER_WORKER))
regs = NULL;
+ else
+ regs = task_pt_regs(current);
}
if (regs) {
diff --git a/kernel/events/core.c b/kernel/events/core.c
index bade8e0fced7..f880cec0c980 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7446,7 +7446,7 @@ static void perf_sample_regs_user(struct perf_regs *regs_user,
if (user_mode(regs)) {
regs_user->abi = perf_reg_abi(current);
regs_user->regs = regs;
- } else if (!(current->flags & PF_KTHREAD)) {
+ } else if (!(current->flags & (PF_KTHREAD | PF_USER_WORKER))) {
perf_get_regs_user(regs_user, regs);
} else {
regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE;
@@ -8086,7 +8086,7 @@ static u64 perf_virt_to_phys(u64 virt)
* Try IRQ-safe get_user_page_fast_only first.
* If failed, leave phys_addr as 0.
*/
- if (current->mm != NULL) {
+ if (!(current->flags & (PF_KTHREAD | PF_USER_WORKER))) {
struct page *p;
pagefault_disable();
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RESEND][PATCH 4/5] perf: Simplify get_perf_callchain() user logic
2025-08-20 18:03 [RESEND][PATCH 0/5] perf: Clean ups and simplifications Steven Rostedt
` (2 preceding siblings ...)
2025-08-20 18:03 ` [RESEND][PATCH 3/5] perf: Use current->flags & PF_KTHREAD|PF_USER_WORKER instead of current->mm == NULL Steven Rostedt
@ 2025-08-20 18:03 ` Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 5/5] perf: Skip user unwind if the task is a kernel thread Steven Rostedt
2025-08-25 11:12 ` [RESEND][PATCH 0/5] perf: Clean ups and simplifications Peter Zijlstra
5 siblings, 0 replies; 7+ messages in thread
From: Steven Rostedt @ 2025-08-20 18:03 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel, linux-perf-users
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, Liang, Kan, Thomas Gleixner, Josh Poimboeuf
From: Josh Poimboeuf <jpoimboe@kernel.org>
Simplify the get_perf_callchain() user logic a bit. task_pt_regs()
should never be NULL.
Acked-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/events/callchain.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c
index 5982d18f169b..808c0d7a31fa 100644
--- a/kernel/events/callchain.c
+++ b/kernel/events/callchain.c
@@ -247,21 +247,19 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
if (user && !crosstask) {
if (!user_mode(regs)) {
if (current->flags & (PF_KTHREAD | PF_USER_WORKER))
- regs = NULL;
- else
- regs = task_pt_regs(current);
+ goto exit_put;
+ regs = task_pt_regs(current);
}
- if (regs) {
- if (add_mark)
- perf_callchain_store_context(&ctx, PERF_CONTEXT_USER);
+ if (add_mark)
+ perf_callchain_store_context(&ctx, PERF_CONTEXT_USER);
- start_entry_idx = entry->nr;
- perf_callchain_user(&ctx, regs);
- fixup_uretprobe_trampoline_entries(entry, start_entry_idx);
- }
+ start_entry_idx = entry->nr;
+ perf_callchain_user(&ctx, regs);
+ fixup_uretprobe_trampoline_entries(entry, start_entry_idx);
}
+exit_put:
put_callchain_entry(rctx);
return entry;
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RESEND][PATCH 5/5] perf: Skip user unwind if the task is a kernel thread
2025-08-20 18:03 [RESEND][PATCH 0/5] perf: Clean ups and simplifications Steven Rostedt
` (3 preceding siblings ...)
2025-08-20 18:03 ` [RESEND][PATCH 4/5] perf: Simplify get_perf_callchain() user logic Steven Rostedt
@ 2025-08-20 18:03 ` Steven Rostedt
2025-08-25 11:12 ` [RESEND][PATCH 0/5] perf: Clean ups and simplifications Peter Zijlstra
5 siblings, 0 replies; 7+ messages in thread
From: Steven Rostedt @ 2025-08-20 18:03 UTC (permalink / raw)
To: linux-kernel, linux-trace-kernel, linux-perf-users
Cc: Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Alexander Shishkin, Jiri Olsa, Ian Rogers,
Adrian Hunter, Liang, Kan, Thomas Gleixner, Josh Poimboeuf
From: Josh Poimboeuf <jpoimboe@kernel.org>
If the task is not a user thread, there's no user stack to unwind.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
kernel/events/core.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index f880cec0c980..28de3baff792 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -8198,7 +8198,8 @@ struct perf_callchain_entry *
perf_callchain(struct perf_event *event, struct pt_regs *regs)
{
bool kernel = !event->attr.exclude_callchain_kernel;
- bool user = !event->attr.exclude_callchain_user;
+ bool user = !event->attr.exclude_callchain_user &&
+ !(current->flags & (PF_KTHREAD | PF_USER_WORKER));
/* Disallow cross-task user callchains. */
bool crosstask = event->ctx->task && event->ctx->task != current;
const u32 max_stack = event->attr.sample_max_stack;
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [RESEND][PATCH 0/5] perf: Clean ups and simplifications
2025-08-20 18:03 [RESEND][PATCH 0/5] perf: Clean ups and simplifications Steven Rostedt
` (4 preceding siblings ...)
2025-08-20 18:03 ` [RESEND][PATCH 5/5] perf: Skip user unwind if the task is a kernel thread Steven Rostedt
@ 2025-08-25 11:12 ` Peter Zijlstra
5 siblings, 0 replies; 7+ messages in thread
From: Peter Zijlstra @ 2025-08-25 11:12 UTC (permalink / raw)
To: Steven Rostedt
Cc: linux-kernel, linux-trace-kernel, linux-perf-users,
Masami Hiramatsu, Mark Rutland, Mathieu Desnoyers, Andrew Morton,
Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
Liang, Kan, Thomas Gleixner
On Wed, Aug 20, 2025 at 02:03:38PM -0400, Steven Rostedt wrote:
>
> This is a resend from: https://lore.kernel.org/linux-trace-kernel/20250717173125.434618999@kernel.org/
>
> It cleanly applied on top of the latest tip/perf/core:
> 448f97fba901 ("perf: Convert mmap() refcounts to refcount_t")
>
> The ongoing work to support sframes[1] in the kernel required a few clean ups
> to the perf kernel side. Instead of having these changes in the ongoing
> work, there's no reason they cannot be applied now.
>
> These are just clean ups to the perf code to help simplify the updates that
> will be made later.
>
> [1] https://lore.kernel.org/linux-trace-kernel/20250708020003.565862284@kernel.org
>
>
> Josh Poimboeuf (4):
> perf: Remove get_perf_callchain() init_nr argument
> perf: Have get_perf_callchain() return NULL if crosstask and user are set
> perf: Simplify get_perf_callchain() user logic
> perf: Skip user unwind if the task is a kernel thread
>
> Steven Rostedt (1):
> perf: Use current->flags & PF_KTHREAD|PF_USER_WORKER instead of current->mm == NULL
Thanks!
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-08-25 11:12 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-20 18:03 [RESEND][PATCH 0/5] perf: Clean ups and simplifications Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 1/5] perf: Remove get_perf_callchain() init_nr argument Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 2/5] perf: Have get_perf_callchain() return NULL if crosstask and user are set Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 3/5] perf: Use current->flags & PF_KTHREAD|PF_USER_WORKER instead of current->mm == NULL Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 4/5] perf: Simplify get_perf_callchain() user logic Steven Rostedt
2025-08-20 18:03 ` [RESEND][PATCH 5/5] perf: Skip user unwind if the task is a kernel thread Steven Rostedt
2025-08-25 11:12 ` [RESEND][PATCH 0/5] perf: Clean ups and simplifications Peter Zijlstra
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).