mirror of
https://github.com/torvalds/linux.git
synced 2026-02-04 15:28:49 +08:00
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
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 &&
|
||||
|
||||
Reference in New Issue
Block a user