]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf test record+probe_libc_inet_pton: Make test resilient
authorLeo Yan <leo.yan@arm.com>
Mon, 2 Dec 2024 11:19:58 +0000 (11:19 +0000)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 14 Jan 2025 17:57:20 +0000 (14:57 -0300)
The test failed back and forth due to the call chain being heavily
impacted by the libc, which varies across different architectures and
distros.

The libc contains the symbols for "gaih_inet" and "getaddrinfo" in some
cases, but not always.  Moreover, these symbols can be either normal
symbols or dynamic symbols, making it difficult to decide the call chain
entries due to the symbols are inconsistent.

To fix the issue, this commit identifies three call chain entries are
always present.  These entries are matched by iterating through the
lines in the "perf script" result.  The recording attribute max-stack is
set to 4 for the possible maximum call chain depth.

After:

  # perf test -vF pton
  --- start ---
  Pattern: ping[][0-9 \.:]+probe_libc:inet_pton: \([[:xdigit:]]+\)
    Matching: ping  285058 [025] 1219802.466939: probe_libc:inet_pton: (ffffa14b7cf0)
  Pattern: .*inet_pton\+0x[[:xdigit:]]+[[:space:]]\(/usr/lib/aarch64-linux-gnu/libc-2.31.so|inlined\)$
    Matching: ping  285058 [025] 1219802.466939: probe_libc:inet_pton: (ffffa14b7cf0)
    Matching: ffffa14b7cf0 __GI___inet_pton+0x0 (/usr/lib/aarch64-linux-gnu/libc-2.31.so)
  Pattern: .*(\+0x[[:xdigit:]]+|\[unknown\])[[:space:]]\(.*/bin/ping.*\)$
    Matching: ping  285058 [025] 1219802.466939: probe_libc:inet_pton: (ffffa14b7cf0)
    Matching: ffffa14b7cf0 __GI___inet_pton+0x0 (/usr/lib/aarch64-linux-gnu/libc-2.31.so)
    Matching: ffffa1488040 getaddrinfo+0xe8 (/usr/lib/aarch64-linux-gnu/libc-2.31.so)
    Matching: aaaab8672da4 [unknown] (/usr/bin/ping)
  ---- end ----
   82: probe libc's inet_pton & backtrace it with ping                 : Ok

Closes: https://lore.kernel.org/linux-perf-users/1728978807-81116-1-git-send-email-renyu.zj@linux.alibaba.com/
Closes: https://lore.kernel.org/linux-perf-users/Z0X3AYUWkAgfPpWj@x1/T/#m57327e135b156047e37d214a0d453af6ae1e02be
Reported-by: Guilherme Amadio <amadio@gentoo.org>
Reported-by: Jing Zhang <renyu.zj@linux.alibaba.com>
Reviewed-by: James Clark <james.clark@linaro.org>
Signed-off-by: Leo Yan <leo.yan@arm.com>
Tested-by: Thomas Richter <tmricht@linux.ibm.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20241202111958.553403-1-leo.yan@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/shell/record+probe_libc_inet_pton.sh

index cffdd5fc8b9564820d29e57b986e4802d20b8b73..d5e5193cceb625fd3a3b794e2e8a90481e376234 100755 (executable)
@@ -43,17 +43,8 @@ trace_libc_inet_pton_backtrace() {
                echo "((__GI_)?getaddrinfo|text_to_binary_address)\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
                echo "(gaih_inet|main)\+0x[[:xdigit:]]+[[:space:]]\(inlined|.*/bin/ping.*\)$" >> $expected
                ;;
-       ppc64|ppc64le)
-               eventattr='max-stack=4'
-               # Add gaih_inet to expected backtrace only if it is part of libc.
-               if nm $libc | grep -F -q gaih_inet.; then
-                       echo "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected
-               fi
-               echo "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected
-               echo ".*(\+0x[[:xdigit:]]+|\[unknown\])[[:space:]]\(.*/bin/ping.*\)$" >> $expected
-               ;;
        *)
-               eventattr='max-stack=3'
+               eventattr='max-stack=4'
                echo ".*(\+0x[[:xdigit:]]+|\[unknown\])[[:space:]]\(.*/bin/ping.*\)$" >> $expected
                ;;
        esac
@@ -76,14 +67,25 @@ trace_libc_inet_pton_backtrace() {
        fi
        perf script -i $perf_data | tac | grep -m1 ^ping -B9 | tac > $perf_script
 
-       exec 3<$perf_script
        exec 4<$expected
-       while read line <&3 && read -r pattern <&4; do
+       while read -r pattern <&4; do
+               echo "Pattern: $pattern"
                [ -z "$pattern" ] && break
-               echo $line
-               echo "$line" | grep -E -q "$pattern"
-               if [ $? -ne 0 ] ; then
-                       printf "FAIL: expected backtrace entry \"%s\" got \"%s\"\n" "$pattern" "$line"
+
+               found=0
+
+               # Search lines in the perf script result
+               exec 3<$perf_script
+               while read line <&3; do
+                       [ -z "$line" ] && break
+                       echo "  Matching: $line"
+                       ! echo "$line" | grep -E -q "$pattern"
+                       found=$?
+                       [ $found -eq 1 ] && break
+               done
+
+               if [ $found -ne 1 ] ; then
+                       printf "FAIL: Didn't find the expected backtrace entry \"%s\"\n" "$pattern"
                        return 1
                fi
        done