]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scripts/decode_stacktrace.sh: fix build ID and PC source parsing
authorCarlos Llamas <cmllamas@google.com>
Thu, 30 Oct 2025 01:03:33 +0000 (01:03 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Nov 2025 09:37:51 +0000 (10:37 +0100)
commit 7d9f7d390f6af3a29614e81e802e2b9c238eb7b2 upstream.

Support for parsing PC source info in stacktraces (e.g.  '(P)') was added
in commit 2bff77c665ed ("scripts/decode_stacktrace.sh: fix decoding of
lines with an additional info").  However, this logic was placed after the
build ID processing.  This incorrect order fails to parse lines containing
both elements, e.g.:

  drm_gem_mmap_obj+0x114/0x200 [drm 03d0564e0529947d67bb2008c3548be77279fd27] (P)

This patch fixes the problem by extracting the PC source info first and
then processing the module build ID.  With this change, the line above is
now properly parsed as such:

  drm_gem_mmap_obj (./include/linux/mmap_lock.h:212 ./include/linux/mm.h:811 drivers/gpu/drm/drm_gem.c:1177) drm (P)

While here, also add a brief explanation the build ID section.

Link: https://lkml.kernel.org/r/20251030010347.2731925-1-cmllamas@google.com
Fixes: 2bff77c665ed ("scripts/decode_stacktrace.sh: fix decoding of lines with an additional info")
Signed-off-by: Carlos Llamas <cmllamas@google.com>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Cc: Breno Leitao <leitao@debian.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Marc Rutland <mark.rutland@arm.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Matthieu Baerts <matttbe@kernel.org>
Cc: Miroslav Benes <mbenes@suse.cz>
Cc: Puranjay Mohan <puranjay@kernel.org>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
scripts/decode_stacktrace.sh

index 0c92d6a7f777e1b2d5452dd894a13a71e3d58051..823619c815a7c2fea129c264c788ac92e19d7fe7 100755 (executable)
@@ -275,12 +275,6 @@ handle_line() {
                fi
        done
 
-       if [[ ${words[$last]} =~ ^[0-9a-f]+\] ]]; then
-               words[$last-1]="${words[$last-1]} ${words[$last]}"
-               unset words[$last] spaces[$last]
-               last=$(( $last - 1 ))
-       fi
-
        # Extract info after the symbol if present. E.g.:
        # func_name+0x54/0x80 (P)
        #                     ^^^
@@ -293,6 +287,14 @@ handle_line() {
                last=$(( $last - 1 ))
        fi
 
+       # Join module name with its build id if present, as these were
+       # split during tokenization (e.g. "[module" and "modbuildid]").
+       if [[ ${words[$last]} =~ ^[0-9a-f]+\] ]]; then
+               words[$last-1]="${words[$last-1]} ${words[$last]}"
+               unset words[$last] spaces[$last]
+               last=$(( $last - 1 ))
+       fi
+
        if [[ ${words[$last]} =~ \[([^]]+)\] ]]; then
                module=${words[$last]}
                # some traces format is "(%pS)", which like "(foo+0x0/0x1 [bar])"