mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 17:57:38 -04:00
perf: Use current->flags & PF_KTHREAD|PF_USER_WORKER instead of current->mm == NULL
To determine if a task is a kernel thread or not, it is more reliable to use (current->flags & (PF_KTHREAD|PF_USER_WORKERi)) than to rely on current->mm being NULL. That is because some kernel tasks (io_uring helpers) may have a mm field. Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20250820180428.592367294@kernel.org
This commit is contained in:
committed by
Peter Zijlstra
parent
153f9e74de
commit
90942f9fac
@@ -246,10 +246,10 @@ get_perf_callchain(struct pt_regs *regs, bool kernel, bool user,
|
|||||||
|
|
||||||
if (user && !crosstask) {
|
if (user && !crosstask) {
|
||||||
if (!user_mode(regs)) {
|
if (!user_mode(regs)) {
|
||||||
if (current->mm)
|
if (current->flags & (PF_KTHREAD | PF_USER_WORKER))
|
||||||
regs = task_pt_regs(current);
|
|
||||||
else
|
|
||||||
regs = NULL;
|
regs = NULL;
|
||||||
|
else
|
||||||
|
regs = task_pt_regs(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (regs) {
|
if (regs) {
|
||||||
|
|||||||
@@ -7446,7 +7446,7 @@ static void perf_sample_regs_user(struct perf_regs *regs_user,
|
|||||||
if (user_mode(regs)) {
|
if (user_mode(regs)) {
|
||||||
regs_user->abi = perf_reg_abi(current);
|
regs_user->abi = perf_reg_abi(current);
|
||||||
regs_user->regs = regs;
|
regs_user->regs = regs;
|
||||||
} else if (!(current->flags & PF_KTHREAD)) {
|
} else if (!(current->flags & (PF_KTHREAD | PF_USER_WORKER))) {
|
||||||
perf_get_regs_user(regs_user, regs);
|
perf_get_regs_user(regs_user, regs);
|
||||||
} else {
|
} else {
|
||||||
regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE;
|
regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE;
|
||||||
@@ -8086,7 +8086,7 @@ static u64 perf_virt_to_phys(u64 virt)
|
|||||||
* Try IRQ-safe get_user_page_fast_only first.
|
* Try IRQ-safe get_user_page_fast_only first.
|
||||||
* If failed, leave phys_addr as 0.
|
* If failed, leave phys_addr as 0.
|
||||||
*/
|
*/
|
||||||
if (current->mm != NULL) {
|
if (!(current->flags & (PF_KTHREAD | PF_USER_WORKER))) {
|
||||||
struct page *p;
|
struct page *p;
|
||||||
|
|
||||||
pagefault_disable();
|
pagefault_disable();
|
||||||
|
|||||||
Reference in New Issue
Block a user