Skip to content

Commit c00a879

Browse files
committed
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
2 parents e53ada6 + 76ed276 commit c00a879

3 files changed

Lines changed: 9 additions & 4 deletions

File tree

include/linux/sched.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1776,6 +1776,11 @@ static __always_inline bool is_percpu_thread(void)
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7460,7 +7460,7 @@ static void perf_sample_regs_user(struct perf_regs *regs_user,
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)
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)
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 &&

0 commit comments

Comments
 (0)