1#!/bin/bash 2# Test data symbol (exclusive) 3 4# SPDX-License-Identifier: GPL-2.0 5# Leo Yan <leo.yan@linaro.org>, 2022 6 7shelldir=$(dirname "$0") 8 9# shellcheck source=lib/perf_has_symbol.sh 10. "${shelldir}"/lib/perf_has_symbol.sh 11 12skip_if_no_mem_event() { 13 perf mem record -e list 2>&1 | grep -E -q 'available' && return 0 14 return 2 15} 16 17skip_if_no_mem_event || exit 2 18 19skip_test_missing_symbol workload_datasym_buf1 20 21TEST_PROGRAM="perf test -w datasym" 22PERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX) 23ERR_FILE=$(mktemp /tmp/__perf_test.stderr.XXXXX) 24 25check_result() { 26 # The memory report format is as below: 27 # 99.92% ... [.] workload_datasym_buf1+0x38 28 result=$(perf mem report -i ${PERF_DATA} -s symbol_daddr -q 2>&1 | 29 awk '/workload_datasym_buf1/ { print $4 }') 30 31 # Testing is failed if has no any sample for "workload_datasym_buf1" 32 [ -z "$result" ] && return 1 33 34 while IFS= read -r line; do 35 # The "data1" and "data2" fields in structure 36 # "workload_datasym_buf1" have offset "0x0" and "0x38", returns 37 # failure if detect any other offset value. 38 if [ "$line" != "workload_datasym_buf1+0x0" ] && \ 39 [ "$line" != "workload_datasym_buf1+0x38" ]; then 40 return 1 41 fi 42 done <<< "$result" 43 44 return 0 45} 46 47cleanup_files() 48{ 49 echo "Cleaning up files..." 50 rm -f ${PERF_DATA} 51} 52 53trap cleanup_files exit term int 54 55echo "Recording workload..." 56 57# perf mem/c2c internally uses IBS PMU on AMD CPU which doesn't support 58# user/kernel filtering and per-process monitoring, spin program on 59# specific CPU and test in per-CPU mode. 60is_amd=$(grep -E -c 'vendor_id.*AuthenticAMD' /proc/cpuinfo) 61if (($is_amd >= 1)); then 62 perf mem record -vvv -o ${PERF_DATA} -C 0 -- taskset -c 0 $TEST_PROGRAM 2>"${ERR_FILE}" 63else 64 perf mem record -vvv --all-user -o ${PERF_DATA} -- $TEST_PROGRAM 2>"${ERR_FILE}" 65fi 66 67check_result 68exit $? 69