lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 0787/1126] perf test arm64: Test unwinding using fame-pointer (fp) mode
    Date
    From: German Gomez <german.gomez@arm.com>

    [ Upstream commit cd6382d82752737e43ef3617bb9e72913d2b1d47 ]

    Add a shell script to check that the call-graphs generated using frame
    pointers (--call-graph fp) are complete and not missing leaf functions:

    | $ perf test 88 -v
    | 88: Check Arm64 callgraphs are complete in fp mode :
    | --- start ---
    | test child forked, pid 8734
    | + Compiling test program (/tmp/test_program.Cz3yL)...
    | + Recording (PID=8749)...
    | + Stopping perf-record...
    | test_program.Cz
    | 728 leaf
    | 753 parent
    | 76c main
    | test child finished with 0
    | ---- end ----
    | Check Arm SPE callgraphs are complete in fp mode: Ok

    It's supposed to work with both unwinders:

    | $ make                # for libunwind (default)
    | $ make NO_LIBUNWIND=1 # for libdw

    Tester notes:

    Ran it on N1SDP and it passes, and it fails if b9f6fbb3b2c29736 ("perf
    arm64: Inject missing frames when using 'perf record --call-graph=fp'")
    isn't applied.

    Fixes: b9f6fbb3b2c29736 ("perf arm64: Inject missing frames when using 'perf record --call-graph=fp'")
    Suggested-by: Jiri Olsa <jolsa@kernel.org>
    Reviewed-by: James Clark <james.clark@arm.com>
    Tested-by: James Clark <james.clark@arm.com>
    Signed-off-by: German Gomez <german.gomez@arm.com>
    Cc: Alexandre Truong <alexandre.truong@arm.com>
    Cc: Leo Yan <leo.yan@linaro.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Link: https://lore.kernel.org/r/20220316172015.98000-1-german.gomez@arm.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../perf/tests/shell/test_arm_callgraph_fp.sh | 68 +++++++++++++++++++
    1 file changed, 68 insertions(+)
    create mode 100755 tools/perf/tests/shell/test_arm_callgraph_fp.sh

    diff --git a/tools/perf/tests/shell/test_arm_callgraph_fp.sh b/tools/perf/tests/shell/test_arm_callgraph_fp.sh
    new file mode 100755
    index 000000000000..6ffbb27afaba
    --- /dev/null
    +++ b/tools/perf/tests/shell/test_arm_callgraph_fp.sh
    @@ -0,0 +1,68 @@
    +#!/bin/sh
    +# Check Arm64 callgraphs are complete in fp mode
    +# SPDX-License-Identifier: GPL-2.0
    +
    +lscpu | grep -q "aarch64" || exit 2
    +
    +if ! [ -x "$(command -v cc)" ]; then
    + echo "failed: no compiler, install gcc"
    + exit 2
    +fi
    +
    +PERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
    +TEST_PROGRAM_SOURCE=$(mktemp /tmp/test_program.XXXXX.c)
    +TEST_PROGRAM=$(mktemp /tmp/test_program.XXXXX)
    +
    +cleanup_files()
    +{
    + rm -f $PERF_DATA
    + rm -f $TEST_PROGRAM_SOURCE
    + rm -f $TEST_PROGRAM
    +}
    +
    +trap cleanup_files exit term int
    +
    +cat << EOF > $TEST_PROGRAM_SOURCE
    +int a = 0;
    +void leaf(void) {
    + for (;;)
    + a += a;
    +}
    +void parent(void) {
    + leaf();
    +}
    +int main(void) {
    + parent();
    + return 0;
    +}
    +EOF
    +
    +echo " + Compiling test program ($TEST_PROGRAM)..."
    +
    +CFLAGS="-g -O0 -fno-inline -fno-omit-frame-pointer"
    +cc $CFLAGS $TEST_PROGRAM_SOURCE -o $TEST_PROGRAM || exit 1
    +
    +# Add a 1 second delay to skip samples that are not in the leaf() function
    +perf record -o $PERF_DATA --call-graph fp -e cycles//u -D 1000 -- $TEST_PROGRAM 2> /dev/null &
    +PID=$!
    +
    +echo " + Recording (PID=$PID)..."
    +sleep 2
    +echo " + Stopping perf-record..."
    +
    +kill $PID
    +wait $PID
    +
    +# expected perf-script output:
    +#
    +# program
    +# 728 leaf
    +# 753 parent
    +# 76c main
    +# ...
    +
    +perf script -i $PERF_DATA -F comm,ip,sym | head -n4
    +perf script -i $PERF_DATA -F comm,ip,sym | head -n4 | \
    + awk '{ if ($2 != "") sym[i++] = $2 } END { if (sym[0] != "leaf" ||
    + sym[1] != "parent" ||
    + sym[2] != "main") exit 1 }'
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-05 11:14    [W:3.744 / U:0.680 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site