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