History

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

Linus Torvalds committed 9 months ago

Commit c00a8792 parents e53ada6 76ed2763 files · +9 −4Browse files

Unified · Split

3 files
  1. include/linux/sched.h +5 −0
  2. kernel/events/callchain.c +1 −1
  3. kernel/events/core.c +3 −3
include/linux/sched.h+5−0
@@ -1776,6 +1776,11 @@ static __always_inline bool is_percpu_thread(void) · 1775 unmodified lines
17761776 (current->nr_cpus_allowed == 1);
17771777 }
17781778
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+
17791784 /* Per-process atomic flags. */
17801785 #define PFA_NO_NEW_PRIVS 0 /* May not gain new privileges. */
17811786 #define PFA_SPREAD_PAGE 1 /* Spread page cache over cpuset */
kernel/events/callchain.c+1−1
@@ -246,7 +246,7 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user, · 245 unmodified lines
246246
247247 if (user && !crosstask) {
248248 if (!user_mode(regs)) {
249− if (current->flags & (PF_KTHREAD | PF_USER_WORKER))
249+ if (!is_user_task(current))
250250 goto exit_put;
251251 regs = task_pt_regs(current);
252252 }
kernel/events/core.c+3−3
@@ -7460,7 +7460,7 @@ static void perf_sample_regs_user(struct perf_regs *regs_user, · 7459 unmodified lines
74607460 if (user_mode(regs)) {
74617461 regs_user->abi = perf_reg_abi(current);
74627462 regs_user->regs = regs;
7463− } else if (!(current->flags & (PF_KTHREAD | PF_USER_WORKER))) {
7463+ } else if (is_user_task(current)) {
74647464 perf_get_regs_user(regs_user, regs);
74657465 } else {
74667466 regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE;
@@ -8100,7 +8100,7 @@ static u64 perf_virt_to_phys(u64 virt) · 633 unmodified lines
81008100 * Try IRQ-safe get_user_page_fast_only first.
81018101 * If failed, leave phys_addr as 0.
81028102 */
8103− if (!(current->flags & (PF_KTHREAD | PF_USER_WORKER))) {
8103+ if (is_user_task(current)) {
81048104 struct page *p;
81058105
81068106 pagefault_disable();
@@ -8215,7 +8215,7 @@ perf_callchain(struct perf_event *event, struct pt_regs *regs) · 108 unmodified lines
82158215 {
82168216 bool kernel = !event->attr.exclude_callchain_kernel;
82178217 bool user = !event->attr.exclude_callchain_user &&
8218− !(current->flags & (PF_KTHREAD | PF_USER_WORKER));
8218+ is_user_task(current);
82198219 /* Disallow cross-task user callchains. */
82208220 bool crosstask = event->ctx->task && event->ctx->task != current;
82218221 bool defer_user = IS_ENABLED(CONFIG_UNWIND_USER) && user &&