Commit c00a8791 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'perf-urgent-2026-02-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf events fix from Ingo Molnar:
 "Fix a race in the user-callchains code"

* tag 'perf-urgent-2026-02-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf: sched: Fix perf crash with new is_user_task() helper
parents e53ada65 76ed2760
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1776,6 +1776,11 @@ static __always_inline bool is_percpu_thread(void)
		(current->nr_cpus_allowed  == 1);
}

static __always_inline bool is_user_task(struct task_struct *task)
{
	return task->mm && !(task->flags & (PF_KTHREAD | PF_USER_WORKER));
}

/* Per-process atomic flags. */
#define PFA_NO_NEW_PRIVS		0	/* May not gain new privileges. */
#define PFA_SPREAD_PAGE			1	/* Spread page cache over cpuset */
+1 −1
Original line number Diff line number Diff line
@@ -246,7 +246,7 @@ 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))
			if (!is_user_task(current))
				goto exit_put;
			regs = task_pt_regs(current);
		}
+3 −3
Original line number Diff line number Diff line
@@ -7460,7 +7460,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 | PF_USER_WORKER))) {
	} else if (is_user_task(current)) {
		perf_get_regs_user(regs_user, regs);
	} else {
		regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE;
@@ -8100,7 +8100,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->flags & (PF_KTHREAD | PF_USER_WORKER))) {
		if (is_user_task(current)) {
			struct page *p;

			pagefault_disable();
@@ -8215,7 +8215,7 @@ perf_callchain(struct perf_event *event, struct pt_regs *regs)
{
	bool kernel = !event->attr.exclude_callchain_kernel;
	bool user   = !event->attr.exclude_callchain_user &&
		!(current->flags & (PF_KTHREAD | PF_USER_WORKER));
		is_user_task(current);
	/* Disallow cross-task user callchains. */
	bool crosstask = event->ctx->task && event->ctx->task != current;
	bool defer_user = IS_ENABLED(CONFIG_UNWIND_USER) && user &&