#!/bin/sh
# - runtime
# - pattern
# - mapsize
# - setsize
# - total_setsize
# - shape
# - nr_processes
# - nr_threads
# - cpu_node_bind
# - mem_node_bind
# - timestamp
# - cold
# - access
# - delay
# - initialize
# - offset
# - quiet
# - ratio
# - threshold

. "$LKP_SRC/lib/common.sh"
. "$LKP_SRC/lib/reproduce-log.sh"
. "$LKP_SRC/lib/numactl.sh"

: "${runtime:=300}"
: "${nr_processes:=1}"

set_opt()
{
	opt=
	if [ -n "$total_setsize" ] && [ -z "$setsize" ]; then
		setsize=$((total_setsize / nr_processes))
	fi
	if [ -n "$setsize" ]; then
		opt="${opt} -s$((setsize/1024/1024))"
		[ -z "$mapsize" ] && mapsize="$setsize"
	fi
	[ -n "$mapsize" ] && {
		mapsize=$((mapsize/1024/1024))
		[ "$mapsize" -eq 0 ] && mapsize=256
		opt="${opt} -m${mapsize}"
	}
	[ -n "$pattern" ] && opt="${opt} -p${pattern}"
	[ -n "$shape" ] && opt="${opt} -e${shape}"
	[ -n "$nr_threads" ] && opt="${opt} -j${nr_threads}"
	[ -n "$timestamp" ] && opt="${opt} -t${timestamp}"
	parse_bool -q "$cold" && opt="${opt} -c"
	[ -n "$access" ] && opt="${opt} -a${access}"
	[ -n "$delay" ] && opt="${opt} -d${delay}"
	parse_bool -q "$initialize" && opt="${opt} -i"
	[ -n "$offset" ] && opt="${opt} -o${offset}"
	parse_bool -q "$quiet" && opt="${opt} -q"
	[ -n "$ratio" ] && opt="${opt} -r${ratio}"
	[ -n "$threshold" ] && opt="${opt} -h${threshold}"
}

set_opt

pmb_tmp_dir="$TMP/pmbench"
rm -rf "$pmb_tmp_dir"
mkdir -p "$pmb_tmp_dir"

parse_numa_node_binding "$cpu_node_bind" "$mem_node_bind"

pmbench=/usr/local/bin/pmbench

: "${cgroups:=nocg}"
i=1

if [ "$cgroup_ver" = 1 ]; then
	cgdir="$CGROUP_MNT/memory"
else
	cgdir="$CGROUP_MNT"
fi

while [ "$i" -le "$nr_processes" ]; do
	for cg in $cgroups; do
		numa_bind=$(numa_node_binding "$i")
		if [ "$cg" != nocg ]; then
			log_eval "echo \$\$ > $cgdir/$cg/tasks"
		fi
		log_echo "$exec_prefix $numa_bind $pmbench $opt $runtime > $pmb_tmp_dir/pmbench.$i &"
		$numa_bind $pmbench $opt $runtime > "$pmb_tmp_dir/pmbench.$i" &
		echo $! >> $TMP/pid-tests
		i=$((i+1))
		[ "$i" -gt "$nr_processes" ] && break
	done
done

wait

cat "$pmb_tmp_dir"/pmbench.*
