]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf test: Fix inet_pton probe failure and unroll call graph
authorIan Rogers <irogers@google.com>
Sat, 11 Apr 2026 19:37:05 +0000 (12:37 -0700)
committerNamhyung Kim <namhyung@kernel.org>
Tue, 14 Apr 2026 06:28:14 +0000 (23:28 -0700)
When adding a probe for libc's inet_pton, perf probe may create multiple
probe points (e.g., due to inlining or multiple symbol resolutions),
resulting in multiple identical event names being output (e.g.,
`probe_libc:inet_pton_1`).

The script previously used a brittle pipeline (`tail -n +2 | head -n -5`)
and an awk script to extract the event name. When multiple probes were
added, awk would output the event name multiple times, which expanded
to multiple words in bash. This broke the subsequent `perf record` and
`perf probe -d` commands, causing the test to fail with:
`Error: another command except --add is set.`

Fix this by removing the brittle `tail/head` commands and appending
`| head -n 1` to the awk extraction. This ensures that only a single,
unique event name is captured, regardless of how many probe points
are created.

Additionally, the test artificially limited the backtrace size via
`max-stack=4` and did not specify dwarf call graphs for non-s390x
architectures. In newer libc versions where `inet_pton` is nested
deeper or compiled without frame pointers, `perf script` failed to resolve
the backtrace up to `/bin/ping`. Fix this by explicitly collecting
dwarf call-graphs for all architectures and increasing `max-stack` to 8.

Assisted-by: Gemini:gemini-3.1-pro-preview
Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Thomas Richter <tmricht@linux.ibm.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/tests/shell/record+probe_libc_inet_pton.sh

index ab99bef556bf040d47a0ec5bc6f62cb255be1428..eca629ee83f0354016cd9dea1c62737d88a3d1ca 100755 (executable)
@@ -22,9 +22,9 @@ event_pattern='probe_libc:inet_pton(_[[:digit:]]+)?'
 
 add_libc_inet_pton_event() {
 
-       event_name=$(perf probe -f -x $libc -a inet_pton 2>&1 | tail -n +2 | head -n -5 | \
+       event_name=$(perf probe -f -x $libc -a inet_pton 2>&1 | \
                        awk -v ep="$event_pattern" -v l="$libc" '$0 ~ ep && $0 ~ \
-                       ("\\(on inet_pton in " l "\\)") {print $1}')
+                       ("\\(on inet_pton in " l "\\)") {print $1}' | head -n 1)
 
        if [ $? -ne 0 ] || [ -z "$event_name" ] ; then
                printf "FAIL: could not add event\n"
@@ -40,12 +40,12 @@ trace_libc_inet_pton_backtrace() {
        echo ".*inet_pton\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
        case "$(uname -m)" in
        s390x)
-               eventattr='call-graph=dwarf,max-stack=4'
+               eventattr='call-graph=dwarf,max-stack=8'
                echo "((__GI_)?getaddrinfo|text_to_binary_address)\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
                echo "(gaih_inet|main)\+0x[[:xdigit:]]+[[:space:]]\(inlined|.*/bin/ping.*\)$" >> $expected
                ;;
        *)
-               eventattr='max-stack=4'
+               eventattr='call-graph=dwarf,max-stack=8'
                echo ".*(\+0x[[:xdigit:]]+|\[unknown\])[[:space:]]\(.*/bin/ping.*\)$" >> $expected
                ;;
        esac