Messages in this thread Patch in this message | | | From | Leo Yan <> | Subject | [PATCH v2] perf test: Introduce script for data symbol testing | Date | Sat, 6 Aug 2022 11:32:34 +0800 |
| |
This commit introduces a shell script for data symbol testing.
The testing is designed a data structure with 64-byte alignment, it has two fields "data1" and "data2", and other fields are reserved.
Using "perf mem" command, we can record and report memory samples for a self-contained workload with 1 second duration. If have no any memory sample for the data structure "buf1", it reports failure; and by checking the offset in structure "buf1", if any memory accessing is not for "data1" and "data2" fields, it means wrong data symbol parsing and returns failure.
Signed-off-by: Leo Yan <leo.yan@linaro.org> ---
Changes from v1: - Removed "killall" since the test has no child process (Ian); - Used "char" instead of "long" in the buf structure.
tools/perf/tests/shell/test_data_symbol.sh | 92 ++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100755 tools/perf/tests/shell/test_data_symbol.sh
diff --git a/tools/perf/tests/shell/test_data_symbol.sh b/tools/perf/tests/shell/test_data_symbol.sh new file mode 100755 index 000000000000..d007513ecfbe --- /dev/null +++ b/tools/perf/tests/shell/test_data_symbol.sh @@ -0,0 +1,92 @@ +#!/bin/bash +# Test data symbol + +# SPDX-License-Identifier: GPL-2.0 +# Leo Yan <leo.yan@linaro.org>, 2022 + +skip_if_no_mem_event() { + perf mem record -e list 2>&1 | egrep -q 'available' && return 0 + return 2 +} + +skip_if_no_mem_event || exit 2 + +# skip if there's no compiler +if ! [ -x "$(command -v cc)" ]; then + echo "skip: no compiler, install gcc" + exit 2 +fi + +TEST_PROGRAM_SOURCE=$(mktemp /tmp/__perf_test.program.XXXXX.c) +TEST_PROGRAM=$(mktemp /tmp/__perf_test.program.XXXXX) +PERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX) + +check_result() { + # The memory report format is as below: + # 99.92% ... [.] buf1+0x38 ... + result=$(perf mem report -i ${PERF_DATA} --stdio 2>&1 | egrep "buf1" | \ + awk '{ for (i = 1; i <= NF; i++) { if ($i ~ /^buf1/) { print $i; break; } } }') + + # Testing is failed if has no any sample for "buf1" + [ -z "$result" ] && return 1 + + while IFS= read -r line; do + # The "data1" and "data2" fields in structure "buf1" have + # offset "0x0" and "0x38", returns failure if detect any + # other offset value. + if [ "$line" != "buf1+0x0" ] && [ "$line" != "buf1+0x38" ]; then + return 1 + fi + done <<< "$result" + + return 0 +} + +cleanup_files() +{ + echo "Cleaning up files..." + rm -f ${PERF_DATA} + rm -f ${TEST_PROGRAM_SOURCE} + rm -f ${TEST_PROGRAM} +} + +trap cleanup_files exit term int + +# compile test program +cat << EOF > $TEST_PROGRAM_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +typedef struct _buf { + char data1; + char reserved[55]; + char data2; +} buf __attribute__((aligned(64))); + +static buf buf1; + +int main() { + int i; + for (;;) { + buf1.data1++; + buf1.data2 += buf1.data1; + } + return 0; +} +EOF + +echo "Compiling test program..." +cc $TEST_PROGRAM_SOURCE -o $TEST_PROGRAM || exit 1 + +echo "Recording workload..." +perf mem record --all-user -o ${PERF_DATA} -- $TEST_PROGRAM & +PERFPID=$! + +sleep 1 + +kill $PERFPID +wait $PERFPID + +check_result +exit $? -- 2.25.1
| |