#!/bin/bash
#set -x

# A few CPUs in node1
CPUS_SHIELD="14-27,42-55"
CPUS="48,49,50,51"
CPUS_LIST="$(echo $CPUS|tr ',' ' ')"
LC_CPU="$(echo $CPUS_LIST|cut -d' ' -f 1)"
BASEDIR="./results/$(uname -r)"
INTVL=0.1

collect_monitors_data() {
	local name=$1
	local node=$2
	local intvl=$3
	local ts=0
	local filname
	local feats
	local mdata_dir

	mdata_dir="/sys/fs/resctrl/lc_cos/mon_data/mon_L3_${node}"
	filname="$BASEDIR/mondata_LC_${name}.txt"
	feats=$(cat /sys/fs/resctrl/info/L3_MON/mon_features)
	echo -e "### $(date)\t" > $filname
	echo -ne "## tstamp\t" >> $filname
	for f in $feats
	do
		echo -ne "$f\t" >> $filname
	done
	echo "##" >> $filname

	echo "Collecting monitors data to $filname for features: $feats"
	while true
	do
		data_point="$ts"
		for f in $feats
		do
			data_point="${data_point}\t\t$(cat ${mdata_dir}/${f})"
		done
		echo -e $data_point >> $filname
		sleep $intvl
		ts="$(echo "$ts + $intvl"|bc)"
	done
}

one_run() {
	local pids
	local mpid
	local lc_mask=$1
	local be_mask=$2
	local intvl=$3
	local str_mask

	echo "Running WITH cache partitioning... (LC) $lc_mask <--> $be_mask (BE)"
	echo "L3DATA:0=7ff;1=${lc_mask}" > /sys/fs/resctrl/lc_cos/schemata
	echo "L3CODE:0=7ff;1=${lc_mask}" > /sys/fs/resctrl/lc_cos/schemata
	echo "L3DATA:0=7ff;1=${be_mask}" > /sys/fs/resctrl/be_cos/schemata
	echo "L3CODE:0=7ff;1=${be_mask}" > /sys/fs/resctrl/be_cos/schemata
	str_mask="${lc_mask}_${be_mask}"

	(collect_monitors_data $str_mask "01" $intvl)&
	mpid=$!
	sleep 1

	echo "===>Timing LONELY LC task on $LC_CPU"
	cset shield --exec -- taskset -ac $LC_CPU time tar -czf r1_test.tar.gz r1.mp4

	echo "Adding trouble-makers..."
	for cpu in $CPUS_LIST
	do
		[ "$cpu" == "$LC_CPU" ] && continue
		cset shield --exec -- taskset -ac $cpu stress-ng --cpu 1 --cache 16 --cache-level 3 &
		pids="$pids $!"
		echo "Spawned stress-ng($!) on $cpu"
	done

	echo "----------------------------------------------------------------------------"
	echo "Spawned PIDS:$pids ....waiting for noise to build up...5s " && sleep 5
	echo "===>>> Timing LC task on $LC_CPU with noise..."
	cset shield --exec -- taskset -ac $LC_CPU time tar -czf r1_test.tar.gz r1.mp4
	echo "============================================================================"

	echo "Cleanup $pids"
	for pid in $pids; do kill $pid; done

	echo "Cleanup data collector...$mpid"
	sync && kill $mpid
}

### Main

[ "x$(id -u)" != "x0" ] && echo "You have to be root..." && exit 1
mkdir -p $BASEDIR
mountpoint /sys/fs/resctrl/ || sudo mount -t resctrl resctrl -o cdp /sys/fs/resctrl/
for cpu in $CPU_LIST
do
	echo performance > /sys/devices/system/cpu/cpu${spu}/cpufreq/scaling_governor
done

cset shield -c $CPUS_SHIELD -k on || exit 1

# Move LC cpu to its own COS
mkdir /sys/fs/resctrl/lc_cos
echo 48 > /sys/fs/resctrl/lc_cos/cpus_list
# Move BE cpus to its own COS
mkdir /sys/fs/resctrl/be_cos
echo 49,50,51 > /sys/fs/resctrl/be_cos/cpus_list

# Run with different cache parts...
one_run 7ff 7ff $INTVL
one_run 700 0ff $INTVL
one_run 7f0 00f $INTVL
one_run 7fe 001 $INTVL

cset shield -r
