perf tests: Fix record+probe_libc_inet_pton.sh when event exists
If the event 'probe_libc:inet_pton' already exists, this test fails and deletes the existing event before exiting. This will then pass for any subsequent executions. Instead of skipping to deleting the existing event because of failing to add a new event, a duplicate event is now created and the script continues with the usual checks. Only the new duplicate event that is created at the beginning of the test is deleted as a part of the cleanups in the end. All existing events remain as it is. This can be observed on a powerpc64 system running Fedora 27 as shown below. # perf probe -x /usr/lib64/power8/libc-2.26.so -a inet_pton Added new event: probe_libc:inet_pton (on inet_pton in /usr/lib64/power8/libc-2.26.so) Before: # perf test -v "probe libc's inet_pton & backtrace it with ping" 62: probe libc's inet_pton & backtrace it with ping : --- start --- test child forked, pid 21302 test child finished with -1 ---- end ---- probe libc's inet_pton & backtrace it with ping: FAILED! # perf probe --list After: # perf test -v "probe libc's inet_pton & backtrace it with ping" 62: probe libc's inet_pton & backtrace it with ping : --- start --- test child forked, pid 21490 ping 21513 [035] 39357.565561: probe_libc:inet_pton_1: (7fffa4c623b0) 7fffa4c623b0 __GI___inet_pton+0x0 (/usr/lib64/power8/libc-2.26.so) 7fffa4c190dc gaih_inet.constprop.7+0xf4c (/usr/lib64/power8/libc-2.26.so) 7fffa4c19c4c getaddrinfo+0x15c (/usr/lib64/power8/libc-2.26.so) 111d93c20 main+0x3e0 (/usr/bin/ping) test child finished with 0 ---- end ---- probe libc's inet_pton & backtrace it with ping: Ok # perf probe --list probe_libc:inet_pton (on __inet_pton@resolv/inet_pton.c in /usr/lib64/power8/libc-2.26.so) Signed-off-by: Sandipan Das <sandipan@linux.ibm.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Kim Phillips <kim.phillips@arm.com> Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Cc: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/e11fecff96e6cf4c65cdbd9012463513d7b8356c.1530724939.git.sandipan@linux.ibm.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
83e3b6d73e
commit
60089e42d3
|
@ -13,11 +13,24 @@
|
|||
libc=$(grep -w libc /proc/self/maps | head -1 | sed -r 's/.*[[:space:]](\/.*)/\1/g')
|
||||
nm -Dg $libc 2>/dev/null | fgrep -q inet_pton || exit 254
|
||||
|
||||
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 | \
|
||||
grep -P -o "$event_pattern(?=[[:space:]]\(on inet_pton in $libc\))")
|
||||
|
||||
if [ $? -ne 0 -o -z "$event_name" ] ; then
|
||||
printf "FAIL: could not add event\n"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
trace_libc_inet_pton_backtrace() {
|
||||
|
||||
expected=`mktemp -u /tmp/expected.XXX`
|
||||
|
||||
echo "ping[][0-9 \.:]+probe_libc:inet_pton: \([[:xdigit:]]+\)" > $expected
|
||||
echo "ping[][0-9 \.:]+$event_name: \([[:xdigit:]]+\)" > $expected
|
||||
echo ".*inet_pton\+0x[[:xdigit:]]+[[:space:]]\($libc|inlined\)$" >> $expected
|
||||
case "$(uname -m)" in
|
||||
s390x)
|
||||
|
@ -41,7 +54,7 @@ trace_libc_inet_pton_backtrace() {
|
|||
|
||||
perf_data=`mktemp -u /tmp/perf.data.XXX`
|
||||
perf_script=`mktemp -u /tmp/perf.script.XXX`
|
||||
perf record -e probe_libc:inet_pton/$eventattr/ -o $perf_data ping -6 -c 1 ::1 > /dev/null 2>&1
|
||||
perf record -e $event_name/$eventattr/ -o $perf_data ping -6 -c 1 ::1 > /dev/null 2>&1
|
||||
perf script -i $perf_data > $perf_script
|
||||
|
||||
exec 3<$perf_script
|
||||
|
@ -62,13 +75,20 @@ trace_libc_inet_pton_backtrace() {
|
|||
# even if the perf script output does not match.
|
||||
}
|
||||
|
||||
delete_libc_inet_pton_event() {
|
||||
|
||||
if [ -n "$event_name" ] ; then
|
||||
perf probe -q -d $event_name
|
||||
fi
|
||||
}
|
||||
|
||||
# Check for IPv6 interface existence
|
||||
ip a sh lo | fgrep -q inet6 || exit 2
|
||||
|
||||
skip_if_no_perf_probe && \
|
||||
perf probe -q $libc inet_pton && \
|
||||
add_libc_inet_pton_event && \
|
||||
trace_libc_inet_pton_backtrace
|
||||
err=$?
|
||||
rm -f ${perf_data} ${perf_script} ${expected}
|
||||
perf probe -q -d probe_libc:inet_pton
|
||||
delete_libc_inet_pton_event
|
||||
exit $err
|
||||
|
|
Loading…
Reference in New Issue