[PATCH] perf test record+probe_libc_inet_pton: Fix call chain match on powerpc

Ian Rogers irogers at google.com
Wed Nov 29 06:47:26 AEDT 2023


On Tue, Nov 28, 2023 at 1:57 AM Disha Goel <disgoel at linux.ibm.com> wrote:
>
> On 26/11/23 12:39 pm, Likhitha Korrapati wrote:
>
> > The perf test "probe libc's inet_pton & backtrace it with ping" fails on
> > powerpc as below:
> >
> > root at xxx perf]# perf test -v "probe libc's inet_pton & backtrace it with
> > ping"
> >   85: probe libc's inet_pton & backtrace it with ping                 :
> > --- start ---
> > test child forked, pid 96028
> > ping 96056 [002] 127271.101961: probe_libc:inet_pton: (7fffa1779a60)
> > 7fffa1779a60 __GI___inet_pton+0x0
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> > 7fffa172a73c getaddrinfo+0x121c
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> > FAIL: expected backtrace entry
> > "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\(/usr/lib64/glibc-hwcaps/power10/libc.so.6\)$"
> > got "7fffa172a73c getaddrinfo+0x121c
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)"
> > test child finished with -1
> > ---- end ----
> > probe libc's inet_pton & backtrace it with ping: FAILED!
> >
> > This test installs a probe on libc's inet_pton function, which will use
> > uprobes and then uses perf trace on a ping to localhost. It gets 3
> > levels deep backtrace and checks whether it is what we expected or not.
> >
> > The test started failing from RHEL 9.4 where as it works in previous
> > distro version (RHEL 9.2). Test expects gaih_inet function to be part of
> > backtrace. But in the glibc version (2.34-86) which is part of distro
> > where it fails, this function is missing and hence the test is failing.
> >
> >  From nm and ping command output we can confirm that gaih_inet function
> > is not present in the expected backtrace for glibc version glibc-2.34-86
> >
> > [root at xxx perf]# nm /usr/lib64/glibc-hwcaps/power10/libc.so.6 | grep gaih_inet
> > 00000000001273e0 t gaih_inet_serv
> > 00000000001cd8d8 r gaih_inet_typeproto
> >
> > [root at xxx perf]# perf script -i /tmp/perf.data.6E8
> > ping  104048 [000] 128582.508976: probe_libc:inet_pton: (7fff83779a60)
> >              7fff83779a60 __GI___inet_pton+0x0
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> >              7fff8372a73c getaddrinfo+0x121c
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> >                 11dc73534 [unknown] (/usr/bin/ping)
> >              7fff8362a8c4 __libc_start_call_main+0x84
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> >
> > FAIL: expected backtrace entry
> > "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\(/usr/lib64/glibc-hwcaps/power10/libc.so.6\)$"
> > got "7fff9d52a73c getaddrinfo+0x121c
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)"
> >
> > With version glibc-2.34-60 gaih_inet function is present as part of the
> > expected backtrace. So we cannot just remove the gaih_inet function from
> > the backtrace.
> >
> > [root at xxx perf]# nm /usr/lib64/glibc-hwcaps/power10/libc.so.6 | grep gaih_inet
> > 0000000000130490 t gaih_inet.constprop.0
> > 000000000012e830 t gaih_inet_serv
> > 00000000001d45e4 r gaih_inet_typeproto
> >
> > [root at xxx perf]# ./perf script -i /tmp/perf.data.b6S
> > ping   67906 [000] 22699.591699: probe_libc:inet_pton_3: (7fffbdd80820)
> >              7fffbdd80820 __GI___inet_pton+0x0
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> >              7fffbdd31160 gaih_inet.constprop.0+0xcd0
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> >              7fffbdd31c7c getaddrinfo+0x14c
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> >                 1140d3558 [unknown] (/usr/bin/ping)
> >
> > This patch solves this issue by doing a conditional skip. If there is a
> > gaih_inet function present in the libc then it will be added to the
> > expected backtrace else the function will be skipped from being added
> > to the expected backtrace.
> >
> > Output with the patch
> >
> > [root at xxx perf]# ./perf test -v "probe libc's inet_pton & backtrace it
> > with ping"
> >   83: probe libc's inet_pton & backtrace it with ping                 :
> > --- start ---
> > test child forked, pid 102662
> > ping 102692 [000] 127935.549973: probe_libc:inet_pton: (7fff93379a60)
> > 7fff93379a60 __GI___inet_pton+0x0
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> > 7fff9332a73c getaddrinfo+0x121c
> > (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
> > 11ef03534 [unknown] (/usr/bin/ping)
> > test child finished with 0
> > ---- end ----
> > probe libc's inet_pton & backtrace it with ping: Ok
> >
> > Signed-off-by: Likhitha Korrapati <likhitha at linux.ibm.com>
> > Reported-by: Disha Goel <disgoel at linux.ibm.com>
>
> Thanks for the fix patch.
> I have tested on a Power10 machine, "probe libc's inet_pton & backtrace it with ping"
> perf test passes with the patch applied.
>
> Output where gaih_inet function is not present
>
>         # perf test -v "probe libc's inet_pton & backtrace it with ping"
>          85: probe libc's inet_pton & backtrace it with ping                 :
>         --- start ---
>         test child forked, pid 4622
>         ping 4652 [011] 58.987631: probe_libc:inet_pton: (7fff91b79a60)
>         7fff91b79a60 __GI___inet_pton+0x0 (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
>         7fff91b2a73c getaddrinfo+0x121c (/usr/lib64/glibc-hwcaps/power10/libc.so.6)
>         119e53534 [unknown] (/usr/bin/ping)
>         test child finished with 0
>         ---- end ----
>         probe libc's inet_pton & backtrace it with ping: Ok
>
> Output where gaih_inet function is present
>
>         # ./perf test -v "probe libc's inet_pton & backtrace it with ping"
>          83: probe libc's inet_pton & backtrace it with ping                 :
>         --- start ---
>         test child forked, pid 84831
>         ping 84861 [000] 79056.019971: probe_libc:inet_pton: (7fff957631e8)
>         7fff957631e8 __GI___inet_pton+0x8 (/usr/lib64/glibc-hwcaps/power9/libc-2.28.so)
>         7fff95718760 gaih_inet.constprop.6+0xa90 (/usr/lib64/glibc-hwcaps/power9/libc-2.28.so)
>         7fff95719974 getaddrinfo+0x164 (/usr/lib64/glibc-hwcaps/power9/libc-2.28.so)
>         122e732a4 [unknown] (/usr/bin/ping)
>         test child finished with 0
>         ---- end ----
>         probe libc's inet_pton & backtrace it with ping: Ok
>
> Tested-by: Disha Goel <disgoel at linux.ibm.com>

Reviewed-by: Ian Rogers <irogers at google.com>

Thanks,
Ian

>
> > ---
> >   tools/perf/tests/shell/record+probe_libc_inet_pton.sh | 5 ++++-
> >   1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > 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 eebeea6bdc76..72c65570db37 100755
> > --- a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
> > +++ b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh
> > @@ -45,7 +45,10 @@ trace_libc_inet_pton_backtrace() {
> >               ;;
> >       ppc64|ppc64le)
> >               eventattr='max-stack=4'
> > -             echo "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected
> > +             # 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
> >               ;;


More information about the Linuxppc-dev mailing list