On Wed, 12 Nov 2025 19:11:15 -0800 Guenter Roeck <[email protected]> wrote:
> Hi Steven, Hi Guenter, Somehow this got filed away in my archive without me seeing it. > > On Wed, Aug 20, 2025 at 02:03:41PM -0400, Steven Rostedt wrote: > > From: Steven Rostedt <[email protected]> > > > > 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/[email protected]/ > > Link: https://lore.kernel.org/all/[email protected]/ > > > > Signed-off-by: Steven Rostedt (Google) <[email protected]> > > --- > > 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))) { > > Subsequent code uses current->mm. This triggers a crash when running a page > table stress test. See below for details. I have seen the crash in 6.12.57 > and 6.18-rc5. Hmm, that should not happen. But obvious it is. Can you add this: diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c index 1f6589578703..ff201098e5e5 100644 --- a/kernel/events/callchain.c +++ b/kernel/events/callchain.c @@ -248,6 +248,8 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user, if (!user_mode(regs)) { if (current->flags & (PF_KTHREAD | PF_USER_WORKER)) goto exit_put; + if (WARN_ONCE(!current->mm, "Bad flags %x", current->flags)) + goto exit_put; regs = task_pt_regs(current); } I'd like to see what current->flags are when ->mm is NULL. Thanks! -- Steve
