[PATCH v2] perf test: Fix inet_pton probe failure and unroll call graph

Ian Rogers posted 1 patch 2 months ago
tools/perf/tests/shell/record+probe_libc_inet_pton.sh | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
[PATCH v2] perf test: Fix inet_pton probe failure and unroll call graph
Posted by Ian Rogers 2 months ago
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>
---
 tools/perf/tests/shell/record+probe_libc_inet_pton.sh | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
index ab99bef556bf..eca629ee83f0 100755
--- a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
+++ b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
@@ -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
-- 
2.53.0.1213.gd9a14994de-goog
Re: [PATCH v2] perf test: Fix inet_pton probe failure and unroll call graph
Posted by Namhyung Kim 2 months ago
On Sat, 11 Apr 2026 12:37:05 -0700, Ian Rogers wrote:
> 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.`
> 
> [...]
Applied to perf-tools-next, thanks!

Best regards,
Namhyung
Re: [PATCH v2] perf test: Fix inet_pton probe failure and unroll call graph
Posted by Thomas Richter 2 months ago
On 4/11/26 21:37, Ian Rogers wrote:
> 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>
> ---
>  tools/perf/tests/shell/record+probe_libc_inet_pton.sh | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
> index ab99bef556bf..eca629ee83f0 100755
> --- a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
> +++ b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
> @@ -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

for s390:

Tested-by: Thomas Richter <tmricht@linux.ibm.com>

-- 
Thomas Richter, Dept 3303, IBM s390 Linux Development, Boeblingen, Germany
--
IBM Deutschland Research & Development GmbH

Vorsitzender des Aufsichtsrats: Wolfgang Wendt

Geschäftsführung: David Faller

Sitz der Gesellschaft: Böblingen / Registergericht: Amtsgericht Stuttgart, HRB 243294