#!/bin/bash

# This simple script checks --all/-a option which is used for
# supressing of default cpuset awareness of options --cpunodebind,
# --physcpubind, --interleave, --preferred and --membind.

# NOTE: Test needs two nodes and two cpus at least

testdir=`dirname "$0"`
: ${srcdir:=${testdir}/..}
: ${builddir:=${srcdir}}
export PATH=${builddir}:$PATH

export old_mask

eval_test() {
       # echo "Running $1.."
       $1
       if [ $? == 1 ] ;  then
          echo -e "$1 FAILED!"
	  reset_mask
          exit 1
       fi
       echo -e "$1 PASSED"
}

function check_arg_order
{
	numactl --all --physcpubind=$HIGHESTCPU ls > /dev/null 2>&1
	if [ $? == 1 ] ; then
		return 1;
	fi
	numactl --physcpubind=$HIGHESTCPU --all ls > /dev/null 2>&1
	if [ $? == 0 ] ; then
		return 1;
	fi

	return 0
}

function check_physcpubind
{
	reset_mask
	set_cpu_affinity 0
	numactl --physcpubind=$HIGHESTCPU ls > /dev/null 2>&1
	if [ $? == 0 ] ; then # shouldn't pass so easy
		return 1;
	fi
	numactl --all --physcpubind=$HIGHESTCPU ls > /dev/null 2>&1
	if [ $? == 1 ] ; then # shouldn't fail
		return 1;
	fi

	return 0
}

function check_cpunodebind
{
	local low_cpu_range
	local high_cpu

	reset_mask
	low_cpu_range=$(cat /sys/devices/system/node/node$LOWESTNODE/cpulist)
	set_cpu_affinity $low_cpu_range
	numactl --cpunodebind=$HIGHESTNODE ls > /dev/null 2>&1
	if [ $? == 1 ] ; then # should pass
		return 1;
	fi
	numactl --all --cpunodebind=$HIGHESTNODE ls > /dev/null 2>&1
	if [ $? == 1 ] ; then # should pass for sure
		return 1;
	fi

	return 0
}

function set_cpu_affinity
{
	taskset -p -c $1 $$ > /dev/null
	#echo -e "\taffinity of shell was set to" $1
}

function get_mask
{
	old_mask=$(taskset -p $$ | cut -f2 -d: | sed -e 's/^[ \t]*//')
}

function reset_mask
{
	taskset -p $old_mask $$ > /dev/null
	#echo -e "\taffinity of shell was reset to" $old_mask
}

HIGHESTCPU=$(grep 'processor' /proc/cpuinfo | tail -n1 | cut -f2 -d':')
HIGHESTCPU=$(echo $HIGHESTCPU | cut -f2 -d' ')
HIGHESTNODE=$(numactl -H | grep -e 'node [0-9]* cpus' | tail -n1 | cut -f2 -d' ')
LOWESTNODE=$(numactl -H | grep -e 'node [0-9]* cpus' | head -n1 | cut -f2 -d' ')

get_mask

eval_test check_arg_order
eval_test check_physcpubind
eval_test check_cpunodebind

reset_mask

exit 0


