Skip to content

Commit 199d5e8

Browse files
captain5050namhyung
authored andcommitted
perf tests script dlfilter: Add a dlfilter test
Compile a simple dlfilter and make sure it remove samples from everything other than a test_loop. Signed-off-by: Ian Rogers <irogers@google.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
1 parent 526ed2f commit 199d5e8

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#!/bin/bash
2+
# perf script --dlfilter tests
3+
# SPDX-License-Identifier: GPL-2.0
4+
5+
set -e
6+
7+
shelldir=$(dirname "$0")
8+
# shellcheck source=lib/setup_python.sh
9+
. "${shelldir}"/lib/setup_python.sh
10+
11+
# skip if there's no compiler
12+
if ! [ -x "$(command -v cc)" ]; then
13+
echo "failed: no compiler, install gcc"
14+
exit 2
15+
fi
16+
17+
err=0
18+
perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
19+
dlfilter_c=$(mktemp /tmp/__perf_test.dlfilter.test.c.XXXXX)
20+
dlfilter_so=$(mktemp /tmp/__perf_test.dlfilter.so.XXXXX)
21+
22+
cleanup() {
23+
rm -f "${perfdata}"
24+
rm -f "${dlfilter_c}"
25+
rm -f "${dlfilter_so}"
26+
rm -f "${dlfilter_so}.o"
27+
28+
trap - EXIT TERM INT
29+
}
30+
31+
trap_cleanup() {
32+
echo "Unexpected signal in ${FUNCNAME[1]}"
33+
cleanup
34+
exit 1
35+
}
36+
trap trap_cleanup EXIT TERM INT
37+
38+
cat <<EOF > "${dlfilter_c}"
39+
#include <perf/perf_dlfilter.h>
40+
#include <string.h>
41+
#include <stdio.h>
42+
43+
struct perf_dlfilter_fns perf_dlfilter_fns;
44+
45+
int filter_event(void *data, const struct perf_dlfilter_sample *sample, void *ctx)
46+
{
47+
const struct perf_dlfilter_al *al;
48+
49+
if (!sample->ip)
50+
return 0;
51+
52+
al = perf_dlfilter_fns.resolve_ip(ctx);
53+
if (!al || !al->sym || strcmp(al->sym, "test_loop"))
54+
return 1;
55+
56+
return 0;
57+
}
58+
EOF
59+
60+
test_dlfilter() {
61+
echo "Basic --dlfilter test"
62+
# Generate perf.data file
63+
if ! perf record -o "${perfdata}" perf test -w thloop 1 2> /dev/null
64+
then
65+
echo "Basic --dlfilter test [Failed record]"
66+
err=1
67+
return
68+
fi
69+
70+
# Build the dlfilter
71+
if ! cc -c -I tools/perf/include -fpic -x c "${dlfilter_c}" -o "${dlfilter_so}.o"
72+
then
73+
echo "Basic --dlfilter test [Failed to build dlfilter object]"
74+
err=1
75+
return
76+
fi
77+
78+
if ! cc -shared -o "${dlfilter_so}" "${dlfilter_so}.o"
79+
then
80+
echo "Basic --dlfilter test [Failed to link dlfilter shared object]"
81+
err=1
82+
return
83+
fi
84+
85+
# Check that the output contains "test_loop" and nothing else
86+
if ! perf script -i "${perfdata}" --dlfilter "${dlfilter_so}" | grep -q "test_loop"
87+
then
88+
echo "Basic --dlfilter test [Failed missing output]"
89+
err=1
90+
return
91+
fi
92+
93+
# The filter should filter out everything except test_loop, so ensure no other symbols are present
94+
# This is a simple check; we could be more rigorous
95+
if perf script -i "${perfdata}" --dlfilter "${dlfilter_so}" | grep -v "test_loop" | grep -q "perf"
96+
then
97+
echo "Basic --dlfilter test [Failed filtering]"
98+
err=1
99+
return
100+
fi
101+
102+
echo "Basic --dlfilter test [Success]"
103+
}
104+
105+
test_dlfilter
106+
cleanup
107+
exit $err

0 commit comments

Comments
 (0)