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
Unified · Split
| @@ -1776,6 +1776,11 @@ static __always_inline bool is_percpu_thread(void) · 1775 unmodified lines | ||
| 1776 | 1776 | (current->nr_cpus_allowed == 1); |
| 1777 | 1777 | } |
| 1778 | 1778 | |
| 1779 | +static __always_inline bool is_user_task(struct task_struct *task) | |
| 1780 | +{ | |
| 1781 | + return task->mm && !(task->flags & (PF_KTHREAD | PF_USER_WORKER)); | |
| 1782 | +} | |
| 1783 | + | |
| 1779 | 1784 | /* Per-process atomic flags. */ |
| 1780 | 1785 | #define PFA_NO_NEW_PRIVS 0 /* May not gain new privileges. */ |
| 1781 | 1786 | #define PFA_SPREAD_PAGE 1 /* Spread page cache over cpuset */ |
| @@ -246,7 +246,7 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user, · 245 unmodified lines | ||
| 246 | 246 | |
| 247 | 247 | if (user && !crosstask) { |
| 248 | 248 | if (!user_mode(regs)) { |
| 249 | − if (current->flags & (PF_KTHREAD | PF_USER_WORKER)) | |
| 249 | + if (!is_user_task(current)) | |
| 250 | 250 | goto exit_put; |
| 251 | 251 | regs = task_pt_regs(current); |
| 252 | 252 | } |
| @@ -7460,7 +7460,7 @@ static void perf_sample_regs_user(struct perf_regs *regs_user, · 7459 unmodified lines | ||
| 7460 | 7460 | if (user_mode(regs)) { |
| 7461 | 7461 | regs_user->abi = perf_reg_abi(current); |
| 7462 | 7462 | regs_user->regs = regs; |
| 7463 | − } else if (!(current->flags & (PF_KTHREAD | PF_USER_WORKER))) { | |
| 7463 | + } else if (is_user_task(current)) { | |
| 7464 | 7464 | perf_get_regs_user(regs_user, regs); |
| 7465 | 7465 | } else { |
| 7466 | 7466 | regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE; |
| @@ -8100,7 +8100,7 @@ static u64 perf_virt_to_phys(u64 virt) · 633 unmodified lines | ||
| 8100 | 8100 | * Try IRQ-safe get_user_page_fast_only first. |
| 8101 | 8101 | * If failed, leave phys_addr as 0. |
| 8102 | 8102 | */ |
| 8103 | − if (!(current->flags & (PF_KTHREAD | PF_USER_WORKER))) { | |
| 8103 | + if (is_user_task(current)) { | |
| 8104 | 8104 | struct page *p; |
| 8105 | 8105 | |
| 8106 | 8106 | pagefault_disable(); |
| @@ -8215,7 +8215,7 @@ perf_callchain(struct perf_event *event, struct pt_regs *regs) · 108 unmodified lines | ||
| 8215 | 8215 | { |
| 8216 | 8216 | bool kernel = !event->attr.exclude_callchain_kernel; |
| 8217 | 8217 | bool user = !event->attr.exclude_callchain_user && |
| 8218 | − !(current->flags & (PF_KTHREAD | PF_USER_WORKER)); | |
| 8218 | + is_user_task(current); | |
| 8219 | 8219 | /* Disallow cross-task user callchains. */ |
| 8220 | 8220 | bool crosstask = event->ctx->task && event->ctx->task != current; |
| 8221 | 8221 | bool defer_user = IS_ENABLED(CONFIG_UNWIND_USER) && user && |