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 57is_amd=$(grep -E -c 'vendor_id.*AuthenticAMD' /proc/cpuinfo) 58if (($is_amd >= 1)); then 59 mem_events="$(perf mem record -v -e list 2>&1)" 60 if ! [[ "$mem_events" =~ ^mem\-ldst.*ibs_op/(.*)/.*available ]]; then 61 echo "ERROR: mem-ldst event is not matching" 62 exit 1 63 fi 64 65 # --ldlat on AMD: 66 # o Zen4 and earlier uarch does not support ldlat 67 # o Even on supported platforms, it's disabled (--ldlat=0) by default. 68 ldlat=${BASH_REMATCH[1]} 69 if [[ -n $ldlat ]]; then 70 if ! [[ "$ldlat" =~ ldlat=0 ]]; then 71 echo "ERROR: ldlat not initialized to 0?" 72 exit 1 73 fi 74 75 mem_events="$(perf mem record -v --ldlat=150 -e list 2>&1)" 76 if ! [[ "$mem_events" =~ ^mem-ldst.*ibs_op/ldlat=150/.*available ]]; then 77 echo "ERROR: --ldlat not honored?" 78 exit 1 79 fi 80 fi 81 82 # perf mem/c2c internally uses IBS PMU on AMD CPU which doesn't 83 # support user/kernel filtering and per-process monitoring on older 84 # kernels, spin program on specific CPU and test in per-CPU mode. 85 perf mem record -vvv -o ${PERF_DATA} -C 0 -- taskset -c 0 $TEST_PROGRAM 2>"${ERR_FILE}" 86else 87 perf mem record -vvv --all-user -o ${PERF_DATA} -- $TEST_PROGRAM 2>"${ERR_FILE}" 88fi 89 90check_result 91exit $? 92