]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
perf: Use current->flags & PF_KTHREAD|PF_USER_WORKER instead of current->mm == NULL
authorSteven Rostedt <rostedt@goodmis.org>
Wed, 20 Aug 2025 18:03:41 +0000 (14:03 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 2 Nov 2025 13:15:20 +0000 (22:15 +0900)
[ Upstream commit 90942f9fac05702065ff82ed0bade0d08168d4ea ]

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.

Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250820180428.592367294@kernel.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
kernel/events/callchain.c
kernel/events/core.c

index 8a47e52a454f47a5087c07eab5926bc91fe98f2d..d1a09e6f514c98cfb7f3b11d08362b8a4ee957a9 100644 (file)
@@ -241,10 +241,10 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user,
 
        if (user) {
                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) {
index d60d48d482b01427eee1071ed4569389224ff3b1..0339f60e349814dcd7a6a2e31506b7d03bf388f8 100644 (file)
@@ -7095,7 +7095,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;
@@ -7735,7 +7735,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();