#! /bin/bash
#

PAGE_SIZE=4096

RESULTS_DIR=ioprio_inv_test_results

TEST_FILE=/root/dummy
TEST_FILE_SIZE=$[256*1024] # in pages

DROP_CACHES=1
PREP_TEST_FILE=1

CGROUP_MNT=/mnt/cgroup
NR_CGROUPS=2

CGROUP[0]=test1
CGROUP_NR_BUSYLOOPS[0]=2
CGROUP_CFS_PERIOD[0]=100000
CGROUP_CFS_QUOTA[0]=10000
CGROUP_CPUMASK[0]=1

CGROUP[1]=test2
CGROUP_NR_BUSYLOOPS[1]=0
CGROUP_CFS_PERIOD[1]=100000
CGROUP_CFS_QUOTA[1]=-1
CGROUP_CPUMASK[1]=2

function do_test()
{
	local cgrp=$1
	sleep 3
	local pidlist=
	local i=
	for i in `seq 1 ${CGROUP_NR_BUSYLOOPS[$cgrp]}`; do
		while :; do :; done &
		pidlist="$pidlist $!"
	done
	dd if=$TEST_FILE of=/dev/null bs=$PAGE_SIZE count=$TEST_FILE_SIZE &> $RESULTS_DIR/$cgrp.log
	local pid
	for pid in $pidlist; do
		kill $pid
	done
}

rm -rf $RESULTS_DIR
mkdir -p $RESULTS_DIR

if [ $PREP_TEST_FILE -ne 0 ]; then
	echo "Creating test file ($TEST_FILE_SIZE pages)..."
	rm -f $TEST_FILE_SIZE
	dd if=/dev/zero of=$TEST_FILE bs=$PAGE_SIZE count=$TEST_FILE_SIZE &>/dev/null
	echo "Syncing..."
	sync; sync
fi

if [ $DROP_CACHES -ne 0 ]; then
	echo "Dropping caches..."
	echo 3 > /proc/sys/vm/drop_caches
fi

echo "Mounting cgroup..."
mkdir -p $CGROUP_MNT
mount -t cgroup -o cpu,cpuset none $CGROUP_MNT

pidlist=
echo "Preparing test..."
for i in `seq 0 $[NR_CGROUPS-1]`; do
	cgrp=$CGROUP_MNT/${CGROUP[$i]}
	mkdir -p $cgrp
	echo ${CGROUP_CFS_PERIOD[$i]} > $cgrp/cpu.cfs_period_us
	echo ${CGROUP_CFS_QUOTA[$i]} > $cgrp/cpu.cfs_quota_us
	echo ${CGROUP_CPUMASK[$i]} > $cgrp/cpuset.cpus
	echo $$ > $cgrp/tasks
	do_test $i &
	pidlist="$pidlist $!"
done

echo $$ > $CGROUP_MNT/tasks

echo "Testing..."
for pid in $pidlist; do
	wait $pid
done

echo
echo "Results:"
echo
tail -n1 $RESULTS_DIR/*
echo
