blob: 42fb6ca5c18237c16435a1360d981174809a778b [file] [log] [blame]
#!/bin/sh
################################################################################
# options
while getopts ckh flag
do
case $flag in
c)
RUN_COMBINED=true
;;
k)
KEEP_EXISTING_DATA=true
;;
h)
echo "Usage: $0 [-c] [case-*]"
exit
;;
esac
done
shift $(($OPTIND - 1))
[ $(whoami) != root ] && echo "root privilege required" && exit
################################################################################
# stats
reset_stats () {
echo 0 > /proc/lock_stat
echo 1 > /sys/kernel/debug/gcov/reset
}
save_stats () {
base_dir=$(pwd)
mkdir -p $1
(
cd $1
cp /proc/lock_stat . && chmod go+r lock_stat
$base_dir/gcov-mm
$base_dir/gcov-fun mm/*.?.gcov | sort -nr > top-functions
$base_dir/gcov-lock mm/*.?.gcov | sort -nr -k4 > top-locks
rm mm/*.gcno mm/*.gcda
)
}
perf_events="
cpu-cycles
instructions
cache-references
cache-misses
branch-instructions
branch-misses
bus-cycles
cpu-clock
task-clock
page-faults
minor-faults
major-faults
context-switches
cpu-migrations
LLC-loads
LLC-load-misses
LLC-stores
LLC-store-misses
LLC-prefetches
LLC-prefetch-misses
dTLB-loads
dTLB-load-misses
dTLB-stores
dTLB-store-misses
lock:lock_acquire
lock:lock_release
lock:lock_contended
lock:lock_acquired
syscalls:sys_enter_mmap
syscalls:sys_enter_mmap_pgoff
syscalls:sys_enter_brk
syscalls:sys_enter_msync
syscalls:sys_enter_mremap
syscalls:sys_enter_mprotect
syscalls:sys_enter_mbind
syscalls:sys_enter_migrate_pages
syscalls:sys_enter_mlock
syscalls:sys_enter_munlock
syscalls:sys_enter_mlockall
syscalls:sys_enter_munlockall
syscalls:sys_enter_remap_file_pages
"
perf_events=$(echo $perf_events | sed 's/ / -e /g')
################################################################################
# run it
. ./hw_vars
OUT_DIR=$(hostname)-${nr_task}c-$(((mem + (1<<29))>>30))g
TEST_CASES=${@:-$(echo case-*)}
echo $((1<<30)) > /proc/sys/vm/max_map_count
echo $((1<<20)) > /proc/sys/kernel/threads-max
echo 1 > /proc/sys/vm/overcommit_memory
echo 3 > /proc/sys/vm/drop_caches
mount_tmpfs
create_sparse_root
for testcase in $TEST_CASES
do
[ "${testcase#*000}" != "$testcase" ] && continue
[ -x "./$testcase" ] || continue
[[ -n $KEEP_EXISTING_DATA && -d $OUT_DIR/$testcase ]] && continue
reset_stats
echo $testcase
./$testcase || break
save_stats $OUT_DIR/$testcase
# run again to collect perf stats
perf stat -a -e $perf_events -o $OUT_DIR/$testcase/perf-stat ./$testcase
perf record -afg -o $TMPFS_MNT/perf.data ./$testcase 2>/dev/null || continue
perf report -g fractal,5 -i $TMPFS_MNT/perf.data 2>/dev/null > $OUT_DIR/$testcase/perf-report
done
./elapsed-time $OUT_DIR
remove_tmpfs
remove_sparse_root
################################################################################
# run combined
[ -z "$RUN_COMBINED" ] && exit # only run combined cases when asked
kill_detached() {
for pidfile in $SPARSE_ROOT/*.pid
do
[ -s "$pidfile" ] && kill -INT $(cat $pidfile)
rm $pidfile
done
}
for testcase in $TEST_CASES
do
for testcase2 in $TEST_CASES
do
[ -x "./$testcase" ] || continue
[ -x "./$testcase2" ] || continue
[ $testcase = $testcase2 ] && continue
order="$testcase\n$testcase2"
order2=$(echo $order | sort)
[ $order != $order2 ] && continue
[ "${testcase2#*000}" != "$testcase2" ] && continue
reset_stats
if [ "${testcase#*000}" != "$testcase" ]; then
./$testcase # take some memory (mem/3)
./$testcase2 # flush memory (mem*10)
else
./$testcase &
./$testcase2 &
wait
fi
save_stats $OUT_DIR/$testcase-$testcase2
kill_detached
done
done