Commit 90942f9f authored by Steven Rostedt's avatar Steven Rostedt Committed by Peter Zijlstra
Browse files

perf: Use current->flags & PF_KTHREAD|PF_USER_WORKER instead of current->mm == NULL



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: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250820180428.592367294@kernel.org
parent 153f9e74
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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) {
+2 −2
Original line number Diff line number Diff line
@@ -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();