]> www.infradead.org Git - users/jedix/linux-maple.git/commit
perf,uprobes: fix user stack traces in the presence of pending uretprobes
authorAndrii Nakryiko <andrii@kernel.org>
Wed, 22 May 2024 01:38:43 +0000 (18:38 -0700)
committerMasami Hiramatsu (Google) <mhiramat@kernel.org>
Tue, 25 Jun 2024 01:03:23 +0000 (10:03 +0900)
commit4a365eb8a6d9940e838739935f1ce21f1ec8e33f
treeec9c14f9abbc8cb7037649c1dffaa3fea4e7983d
parent3eddb031965ae9a95ba098ae6eb81b082e024c65
perf,uprobes: fix user stack traces in the presence of pending uretprobes

When kernel has pending uretprobes installed, it hijacks original user
function return address on the stack with a uretprobe trampoline
address. There could be multiple such pending uretprobes (either on
different user functions or on the same recursive one) at any given
time within the same task.

This approach interferes with the user stack trace capture logic, which
would report suprising addresses (like 0x7fffffffe000) that correspond
to a special "[uprobes]" section that kernel installs in the target
process address space for uretprobe trampoline code, while logically it
should be an address somewhere within the calling function of another
traced user function.

This is easy to correct for, though. Uprobes subsystem keeps track of
pending uretprobes and records original return addresses. This patch is
using this to do a post-processing step and restore each trampoline
address entries with correct original return address. This is done only
if there are pending uretprobes for current task.

This is a similar approach to what fprobe/kretprobe infrastructure is
doing when capturing kernel stack traces in the presence of pending
return probes.

Link: https://lore.kernel.org/all/20240522013845.1631305-3-andrii@kernel.org/
Reported-by: Riham Selim <rihams@meta.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
kernel/events/callchain.c
kernel/events/uprobes.c