Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf tests buildid: Add purge and remove testing

Add testing for the purge and remove commands. Use the noploop
workload rather than just a return to avoid missing samples in the
workload in perf record. Tidy up the cleanup code to cleanup when
signals happen.

Signed-off-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>

authored by

Ian Rogers and committed by
Namhyung Kim
0eb307d9 ac881007

+177 -26
+177 -26
tools/perf/tests/shell/buildid.sh
··· 36 36 unset WAYLAND_DISPLAY 37 37 fi 38 38 39 - ex_md5=$(mktemp /tmp/perf.ex.MD5.XXX) 40 - ex_sha1=$(mktemp /tmp/perf.ex.SHA1.XXX) 39 + build_id_dir= 40 + ex_source=$(mktemp /tmp/perf_buildid_test.ex.XXX.c) 41 + ex_md5=$(mktemp /tmp/perf_buildid_test.ex.MD5.XXX) 42 + ex_sha1=$(mktemp /tmp/perf_buildid_test.ex.SHA1.XXX) 41 43 ex_pe=$(dirname $0)/../pe-file.exe 44 + data=$(mktemp /tmp/perf_buildid_test.data.XXX) 45 + log_out=$(mktemp /tmp/perf_buildid_test.log.out.XXX) 46 + log_err=$(mktemp /tmp/perf_buildid_test.log.err.XXX) 42 47 43 - echo 'int main(void) { return 0; }' | cc -Wl,--build-id=sha1 -o ${ex_sha1} -x c - 44 - echo 'int main(void) { return 0; }' | cc -Wl,--build-id=md5 -o ${ex_md5} -x c - 48 + cleanup() { 49 + rm -f ${ex_source} ${ex_md5} ${ex_sha1} ${data} ${log_out} ${log_err} 50 + if [ ${run_pe} -eq 1 ]; then 51 + rm -r ${wineprefix} 52 + fi 53 + if [ -d ${build_id_dir} ]; then 54 + rm -rf ${build_id_dir} 55 + fi 56 + trap - EXIT TERM INT 57 + } 45 58 59 + trap_cleanup() { 60 + echo "Unexpected signal in ${FUNCNAME[1]}" 61 + cleanup 62 + exit 1 63 + } 64 + trap trap_cleanup EXIT TERM INT 65 + 66 + # Test program based on the noploop workload. 67 + cat <<EOF > ${ex_source} 68 + #include <stdlib.h> 69 + #include <signal.h> 70 + #include <unistd.h> 71 + 72 + static volatile sig_atomic_t done; 73 + 74 + static void sighandler(int sig) 75 + { 76 + (void)sig; 77 + done = 1; 78 + } 79 + 80 + int main(int argc, const char **argv) 81 + { 82 + int sec = 1; 83 + 84 + if (argc > 1) 85 + sec = atoi(argv[1]); 86 + 87 + signal(SIGINT, sighandler); 88 + signal(SIGALRM, sighandler); 89 + alarm(sec); 90 + 91 + while (!done) 92 + continue; 93 + 94 + return 0; 95 + } 96 + EOF 97 + cc -Wl,--build-id=sha1 ${ex_source} -o ${ex_sha1} -x c - 98 + cc -Wl,--build-id=md5 ${ex_source} -o ${ex_md5} -x c - 46 99 echo "test binaries: ${ex_sha1} ${ex_md5} ${ex_pe}" 47 100 48 - check() 101 + get_build_id() 49 102 { 50 103 case $1 in 51 104 *.exe) ··· 117 64 id=`readelf -n ${1} 2>/dev/null | grep 'Build ID' | awk '{print $3}'` 118 65 ;; 119 66 esac 67 + echo ${id} 68 + } 69 + 70 + check() 71 + { 72 + file=$1 73 + perf_data=$2 74 + 75 + id=$(get_build_id $file) 120 76 echo "build id: ${id}" 121 77 122 78 id_file=${id#??} ··· 138 76 exit 1 139 77 fi 140 78 141 - file=${build_id_dir}/.build-id/$id_dir/`readlink ${link}`/elf 142 - echo "file: ${file}" 79 + cached_file=${build_id_dir}/.build-id/$id_dir/`readlink ${link}`/elf 80 + echo "file: ${cached_file}" 143 81 144 82 # Check for file permission of original file 145 83 # in case of pe-file.exe file 146 84 echo $1 | grep ".exe" 147 85 if [ $? -eq 0 ]; then 148 - if [ -x $1 ] && [ ! -x $file ]; then 149 - echo "failed: file ${file} executable does not exist" 86 + if [ -x $1 ] && [ ! -x $cached_file ]; then 87 + echo "failed: file ${cached_file} executable does not exist" 150 88 exit 1 151 89 fi 152 90 153 - if [ ! -x $file ] && [ ! -e $file ]; then 154 - echo "failed: file ${file} does not exist" 91 + if [ ! -x $cached_file ] && [ ! -e $cached_file ]; then 92 + echo "failed: file ${cached_file} does not exist" 155 93 exit 1 156 94 fi 157 - elif [ ! -x $file ]; then 158 - echo "failed: file ${file} does not exist" 95 + elif [ ! -x $cached_file ]; then 96 + echo "failed: file ${cached_file} does not exist" 159 97 exit 1 160 98 fi 161 99 162 - diff ${file} ${1} 100 + diff ${cached_file} ${1} 163 101 if [ $? -ne 0 ]; then 164 - echo "failed: ${file} do not match" 102 + echo "failed: ${cached_file} do not match" 165 103 exit 1 166 104 fi 167 105 168 - ${perf} buildid-cache -l | grep ${id} 106 + ${perf} buildid-cache -l | grep -q ${id} 169 107 if [ $? -ne 0 ]; then 170 108 echo "failed: ${id} is not reported by \"perf buildid-cache -l\"" 171 109 exit 1 110 + fi 111 + 112 + if [ -n "${perf_data}" ]; then 113 + ${perf} buildid-list -i ${perf_data} | grep -q ${id} 114 + if [ $? -ne 0 ]; then 115 + echo "failed: ${id} is not reported by \"perf buildid-list -i ${perf_data}\"" 116 + exit 1 117 + fi 172 118 fi 173 119 174 120 echo "OK for ${1}" ··· 184 114 185 115 test_add() 186 116 { 187 - build_id_dir=$(mktemp -d /tmp/perf.debug.XXX) 117 + build_id_dir=$(mktemp -d /tmp/perf_buildid_test.debug.XXX) 188 118 perf="perf --buildid-dir ${build_id_dir}" 189 119 190 120 ${perf} buildid-cache -v -a ${1} ··· 198 128 rm -rf ${build_id_dir} 199 129 } 200 130 131 + test_remove() 132 + { 133 + build_id_dir=$(mktemp -d /tmp/perf_buildid_test.debug.XXX) 134 + perf="perf --buildid-dir ${build_id_dir}" 135 + 136 + ${perf} buildid-cache -v -a ${1} 137 + if [ $? -ne 0 ]; then 138 + echo "failed: add ${1} to build id cache" 139 + exit 1 140 + fi 141 + 142 + id=$(get_build_id ${1}) 143 + if ! ${perf} buildid-cache -l | grep -q ${id}; then 144 + echo "failed: ${id} not in cache" 145 + exit 1 146 + fi 147 + 148 + ${perf} buildid-cache -v -r ${1} 149 + if [ $? -ne 0 ]; then 150 + echo "failed: remove ${id} from build id cache" 151 + exit 1 152 + fi 153 + 154 + if ${perf} buildid-cache -l | grep -q ${id}; then 155 + echo "failed: ${id} still in cache after remove" 156 + exit 1 157 + fi 158 + 159 + echo "remove: OK" 160 + rm -rf ${build_id_dir} 161 + } 162 + 163 + test_purge() 164 + { 165 + build_id_dir=$(mktemp -d /tmp/perf_buildid_test.debug.XXX) 166 + perf="perf --buildid-dir ${build_id_dir}" 167 + 168 + id1=$(get_build_id ${ex_sha1}) 169 + ${perf} buildid-cache -v -a ${ex_sha1} 170 + if ! ${perf} buildid-cache -l | grep -q ${id1}; then 171 + echo "failed: ${id1} not in cache" 172 + exit 1 173 + fi 174 + 175 + id2=$(get_build_id ${ex_md5}) 176 + ${perf} buildid-cache -v -a ${ex_md5} 177 + if ! ${perf} buildid-cache -l | grep -q ${id2}; then 178 + echo "failed: ${id2} not in cache" 179 + exit 1 180 + fi 181 + 182 + # Purge by path 183 + ${perf} buildid-cache -v -p ${ex_sha1} 184 + if [ $? -ne 0 ]; then 185 + echo "failed: purge build id cache of ${ex_sha1}" 186 + exit 1 187 + fi 188 + 189 + ${perf} buildid-cache -v -p ${ex_md5} 190 + if [ $? -ne 0 ]; then 191 + echo "failed: purge build id cache of ${ex_md5}" 192 + exit 1 193 + fi 194 + 195 + # Verify both are gone 196 + if ${perf} buildid-cache -l | grep -q ${id1}; then 197 + echo "failed: ${id1} still in cache after purge" 198 + exit 1 199 + fi 200 + 201 + if ${perf} buildid-cache -l | grep -q ${id2}; then 202 + echo "failed: ${id2} still in cache after purge" 203 + exit 1 204 + fi 205 + 206 + echo "purge: OK" 207 + rm -rf ${build_id_dir} 208 + } 209 + 201 210 test_record() 202 211 { 203 - data=$(mktemp /tmp/perf.data.XXX) 204 - build_id_dir=$(mktemp -d /tmp/perf.debug.XXX) 205 - log_out=$(mktemp /tmp/perf.log.out.XXX) 206 - log_err=$(mktemp /tmp/perf.log.err.XXX) 212 + build_id_dir=$(mktemp -d /tmp/perf_buildid_test.debug.XXX) 207 213 perf="perf --buildid-dir ${build_id_dir}" 208 214 209 215 echo "running: perf record $*" ··· 291 145 fi 292 146 293 147 args="$*" 294 - check ${args##* } 148 + check ${args##* } ${data} 295 149 296 150 rm -f ${log_out} ${log_err} 297 151 rm -rf ${build_id_dir} ··· 312 166 test_record wine ${ex_pe} 313 167 fi 314 168 315 - # cleanup 316 - rm ${ex_sha1} ${ex_md5} 317 - if [ ${run_pe} -eq 1 ]; then 318 - rm -r ${wineprefix} 169 + # remove binaries manually via perf buildid-cache -r 170 + test_remove ${ex_sha1} 171 + test_remove ${ex_md5} 172 + if [ ${add_pe} -eq 1 ]; then 173 + test_remove ${ex_pe} 319 174 fi 320 175 176 + # purge binaries manually via perf buildid-cache -p 177 + test_purge 178 + 179 + cleanup 321 180 exit 0