All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@kernel.org>
To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org,
	bpf@vger.kernel.org, x86@kernel.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
	Josh Poimboeuf <jpoimboe@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@kernel.org>, Jiri Olsa <jolsa@kernel.org>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Andrii Nakryiko <andrii@kernel.org>,
	Indu Bhagat <indu.bhagat@oracle.com>,
	"Jose E. Marchesi" <jemarch@gnu.org>,
	Beau Belgrave <beaub@linux.microsoft.com>,
	Jens Remus <jremus@linux.ibm.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Florian Weimer <fweimer@redhat.com>, Sam James <sam@gentoo.org>,
	Kees Cook <kees@kernel.org>,
	"Carlos O'Donell" <codonell@redhat.com>
Subject: [PATCH v6 4/6] tracing: Have deferred user space stacktrace show file offsets
Date: Thu, 28 Aug 2025 14:03:04 -0400	[thread overview]
Message-ID: <20250828180357.052318722@kernel.org> (raw)
In-Reply-To: 20250828180300.591225320@kernel.org

From: Steven Rostedt <rostedt@goodmis.org>

Instead of showing the IP address of the user space stack trace, which is
where ever it was mapped by the kernel, show the offsets of where it would
be in the file.

Instead of:

       trace-cmd-1066    [007] .....    67.770256: <user stack unwind>
cookie=7000000000009
 =>  <00007fdbd0d421ca>
 =>  <00007fdbd0f3be27>
 =>  <00005635ece557e7>
 =>  <00005635ece559d3>
 =>  <00005635ece56523>
 =>  <00005635ece6479d>
 =>  <00005635ece64b01>
 =>  <00005635ece64bc0>
 =>  <00005635ece53b7e>
 =>  <00007fdbd0c6bca8>

Which is the addresses of the functions in the virtual address space of
the process. Have it record:

       trace-cmd-1090    [003] .....   180.779876: <user stack unwind>
cookie=3000000000009
 =>  <00000000001001ca>
 =>  <000000000000ae27>
 =>  <00000000000107e7>
 =>  <00000000000109d3>
 =>  <0000000000011523>
 =>  <000000000001f79d>
 =>  <000000000001fb01>
 =>  <000000000001fbc0>
 =>  <000000000000eb7e>
 =>  <0000000000029ca8>

Which is the offset from code where it was mapped at. To find this
address, the mmap_read_lock is taken and the vma is searched for the
addresses. Then what is recorded is simply:

  (addr - vma->vm_start) + (vma->vm_pgoff << PAGE_SHIFT);

Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
---
 kernel/trace/trace.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index e5b7db19aa53..3e9ef644dd64 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -3136,18 +3136,27 @@ static void trace_user_unwind_callback(struct unwind_work *unwind,
 	struct trace_buffer *buffer = tr->array_buffer.buffer;
 	struct userunwind_stack_entry *entry;
 	struct ring_buffer_event *event;
+	struct mm_struct *mm = current->mm;
 	unsigned int trace_ctx;
+	struct vm_area_struct *vma = NULL;
 	unsigned long *caller;
 	unsigned int offset;
 	int len;
 	int i;
 
+	/* This should never happen */
+	if (!mm)
+		return;
+
 	if (!(tr->trace_flags & TRACE_ITER_USERSTACKTRACE_DELAY))
 		return;
 
 	len = trace->nr * sizeof(unsigned long) + sizeof(*entry);
 
 	trace_ctx = tracing_gen_ctx();
+
+	guard(mmap_read_lock)(mm);
+
 	event = __trace_buffer_lock_reserve(buffer, TRACE_USER_UNWIND_STACK,
 					    len, trace_ctx);
 	if (!event)
@@ -3164,7 +3173,16 @@ static void trace_user_unwind_callback(struct unwind_work *unwind,
 	caller = (void *)entry + offset;
 
 	for (i = 0; i < trace->nr; i++) {
-		caller[i] = trace->entries[i];
+		unsigned long addr = trace->entries[i];
+
+		if (!vma || addr < vma->vm_start || addr >= vma->vm_end)
+			vma = vma_lookup(mm, addr);
+
+		if (!vma) {
+			caller[i] = addr;
+			continue;
+		}
+		caller[i] = (addr - vma->vm_start) + (vma->vm_pgoff << PAGE_SHIFT);
 	}
 
 	__buffer_unlock_commit(buffer, event);
-- 
2.50.1



  parent reply	other threads:[~2025-08-28 18:03 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-28 18:03 [PATCH v6 0/6] tracing: Deferred unwinding of user space stack traces Steven Rostedt
2025-08-28 18:03 ` [PATCH v6 1/6] tracing: Do not bother getting user space stacktraces for kernel threads Steven Rostedt
2025-08-28 18:03 ` [PATCH v6 2/6] tracing: Rename __dynamic_array() to __dynamic_field() for ftrace events Steven Rostedt
2025-08-28 18:03 ` [PATCH v6 3/6] tracing: Implement deferred user space stacktracing Steven Rostedt
2025-08-28 18:03 ` Steven Rostedt [this message]
2025-08-28 18:03 ` [PATCH v6 5/6] tracing: Show inode and device major:minor in deferred user space stacktrace Steven Rostedt
2025-08-28 18:39   ` Linus Torvalds
2025-08-28 18:58     ` Arnaldo Carvalho de Melo
2025-08-28 19:02       ` Mathieu Desnoyers
2025-08-28 19:18       ` Linus Torvalds
2025-08-28 20:04         ` Arnaldo Carvalho de Melo
2025-08-28 20:37           ` Linus Torvalds
2025-08-28 20:17         ` Steven Rostedt
2025-08-28 20:27           ` Arnaldo Carvalho de Melo
2025-08-28 20:42             ` Linus Torvalds
2025-08-28 20:51             ` Steven Rostedt
2025-08-28 21:00               ` Arnaldo Carvalho de Melo
2025-08-28 21:27                 ` Steven Rostedt
2025-08-29 16:27                 ` Sam James
2025-08-28 20:38           ` Linus Torvalds
2025-08-28 20:48             ` Steven Rostedt
2025-08-28 21:06               ` Linus Torvalds
2025-08-28 21:17                 ` Steven Rostedt
2025-08-28 22:10                   ` Linus Torvalds
2025-08-28 22:44                     ` Steven Rostedt
2025-08-29 15:06                     ` Steven Rostedt
2025-08-29 15:47                       ` Linus Torvalds
2025-08-29 16:07                         ` Linus Torvalds
2025-08-29 16:33                           ` Steven Rostedt
2025-08-29 16:42                             ` Linus Torvalds
2025-08-29 16:50                               ` Linus Torvalds
2025-08-29 17:02                                 ` Steven Rostedt
2025-08-29 17:13                                   ` Linus Torvalds
2025-08-29 17:57                                     ` Arnaldo Carvalho de Melo
2025-08-29 20:51                                       ` Linus Torvalds
2025-08-29 16:57                               ` Steven Rostedt
2025-08-29 17:02                                 ` Linus Torvalds
2025-08-29 17:52                                   ` Steven Rostedt
2025-08-29 16:19                         ` Steven Rostedt
2025-08-29 16:28                           ` Linus Torvalds
2025-08-29 16:49                             ` Steven Rostedt
2025-08-29 16:59                               ` Linus Torvalds
2025-08-29 17:17                                 ` Arnaldo Carvalho de Melo
2025-08-29 17:33                                   ` Linus Torvalds
2025-08-29 18:11                                     ` Steven Rostedt
2025-08-29 20:54                                       ` Linus Torvalds
2025-08-29 21:18                                         ` Steven Rostedt
2025-08-29 22:40                                           ` Linus Torvalds
2025-08-29 23:09                                             ` Steven Rostedt
2025-08-29 23:42                                               ` Steven Rostedt
2025-08-30  0:36                                                 ` Steven Rostedt
2025-08-30  0:44                                               ` Steven Rostedt
2025-08-30  0:45                                               ` Linus Torvalds
2025-08-30  1:20                                                 ` Steven Rostedt
2025-08-30  1:26                                                   ` Steven Rostedt
2025-08-30 18:31                                                 ` Steven Rostedt
2025-08-30 19:03                                                   ` Arnaldo Carvalho de Melo
2025-08-30 19:03                                                   ` Linus Torvalds
2025-09-08 21:42                                                     ` Steven Rostedt
2025-09-08 23:09                                                       ` Linus Torvalds
2025-09-08 23:26                                                         ` Linus Torvalds
2025-09-09  1:18                                                         ` Steven Rostedt
2025-08-28 18:03 ` [PATCH v6 6/6] tracing: Add an event to map the inodes to their file names Steven Rostedt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250828180357.052318722@kernel.org \
    --to=rostedt@kernel.org \
    --cc=acme@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=andrii@kernel.org \
    --cc=beaub@linux.microsoft.com \
    --cc=bpf@vger.kernel.org \
    --cc=codonell@redhat.com \
    --cc=fweimer@redhat.com \
    --cc=indu.bhagat@oracle.com \
    --cc=jemarch@gnu.org \
    --cc=jolsa@kernel.org \
    --cc=jpoimboe@kernel.org \
    --cc=jremus@linux.ibm.com \
    --cc=kees@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mhiramat@kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=sam@gentoo.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.