Commit 62a60794 authored by Pawel Wodkowski's avatar Pawel Wodkowski Committed by Jim Harris
Browse files

test/vhost: add support for running more than one vhost instance



Change-Id: I9835a37fe7cdde5329e459d486bd693e7164ea17
Signed-off-by: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-on: https://review.gerrithub.io/398406


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent b71294ed
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
vhost_reactor_mask=0x1
vhost_master_core=0
vhost_0_reactor_mask=0x1
vhost_0_master_core=0

VM_0_qemu_mask=0x6
VM_0_qemu_numa_node=0
+84 −18
Original line number Diff line number Diff line
@@ -83,46 +83,99 @@ else
	set +x
fi

function get_vhost_dir()
{
	if [[ ! -z "$1" ]]; then
		assert_number "$1"
		local vhost_num=$1
	else
		local vhost_num=0
	fi

	echo "$SPDK_VHOST_SCSI_TEST_DIR${vhost_num}"
}

function spdk_vhost_list_all()
{
	shopt -s nullglob
	local vhost_list="$(echo $SPDK_VHOST_SCSI_TEST_DIR[0-9]*)"
	shopt -u nullglob

	if [[ ! -z "$vhost_list" ]]; then
		vhost_list="$(basename --multiple $vhost_list)"
		echo "${vhost_list//vhost/}"
	fi
}

function spdk_vhost_run()
{
	local vhost_conf_path="$1"
	local param
	local vhost_num=0
	local vhost_conf_path=""

	for param in "$@"; do
		case $param in
			--vhost-num=*)
				vhost_num="${param#*=}"
				assert_number "$vhost_num"
				;;
			--conf-path=*) local vhost_conf_path="${param#*=}" ;;
			*)
				error "Invalid parameter '$param'"
				return 1
				;;
		esac
	done


	local vhost_dir="$(get_vhost_dir $vhost_num)"
	if [[ -z "$vhost_conf_path" ]]; then
		error "Missing mandatory parameter '--conf-path'"
		return 1
	fi
	local vhost_app="$SPDK_BUILD_DIR/app/vhost/vhost"
	local vhost_log_file="$SPDK_VHOST_SCSI_TEST_DIR/vhost.log"
	local vhost_pid_file="$SPDK_VHOST_SCSI_TEST_DIR/vhost.pid"
	local vhost_socket="$SPDK_VHOST_SCSI_TEST_DIR/usvhost"
	local vhost_log_file="$vhost_dir/vhost.log"
	local vhost_pid_file="$vhost_dir/vhost.pid"
	local vhost_socket="$vhost_dir/usvhost"
	local vhost_conf_template="$vhost_conf_path/vhost.conf.in"
	local vhost_conf_file="$vhost_conf_path/vhost.conf"
	notice "starting vhost app in background"
	[[ -r "$vhost_pid_file" ]] && spdk_vhost_kill
	[[ -d $SPDK_VHOST_SCSI_TEST_DIR ]] && rm -f $SPDK_VHOST_SCSI_TEST_DIR/*
	mkdir -p $SPDK_VHOST_SCSI_TEST_DIR
	[[ -r "$vhost_pid_file" ]] && spdk_vhost_kill $vhost_num
	[[ -d $vhost_dir ]] && rm -f $vhost_dir/*
	mkdir -p $vhost_dir

	if [[ ! -x $vhost_app ]]; then
		error "application not found: $vhost_app"
		return 1
	fi

	if [[ -z "$vhost_reactor_mask" ]] || [[ -z "$vhost_master_core" ]]; then
		error "Parameters vhost_reactor_mask or vhost_master_core not found in autotest.config file"
	local reactor_mask="vhost_${vhost_num}_reactor_mask"
	reactor_mask="${!reactor_mask}"

	local master_core="vhost_${vhost_num}_master_core"
	master_core="${!master_core}"

	if [[ -z "$reactor_mask" ]] || [[ -z "$master_core" ]]; then
		error "Parameters vhost_${vhost_num}_reactor_mask or vhost_${vhost_num}_master_core not found in autotest.config file"
		return 1
	fi

	cp $vhost_conf_template $vhost_conf_file
	$SPDK_BUILD_DIR/scripts/gen_nvme.sh >> $vhost_conf_file

	local cmd="$vhost_app -m $vhost_reactor_mask -p $vhost_master_core -c $vhost_conf_file"
	local cmd="$vhost_app -m $reactor_mask -p $master_core -c $vhost_conf_file -r $vhost_dir/rpc.sock"

	notice "Loging to:   $vhost_log_file"
	notice "Config file: $vhost_conf_file"
	notice "Socket:      $vhost_socket"
	notice "Command:     $cmd"

	cd $SPDK_VHOST_SCSI_TEST_DIR; $cmd &
	cd $vhost_dir; $cmd &
	vhost_pid=$!
	echo $vhost_pid > $vhost_pid_file

	notice "waiting for app to run..."
	waitforlisten "$vhost_pid"
	waitforlisten "$vhost_pid" "$vhost_dir/rpc.sock"
	notice "vhost started - pid=$vhost_pid"

	rm $vhost_conf_file
@@ -130,7 +183,13 @@ function spdk_vhost_run()

function spdk_vhost_kill()
{
	local vhost_pid_file="$SPDK_VHOST_SCSI_TEST_DIR/vhost.pid"
	local vhost_num=0
	if [[ ! -z "$1" ]]; then
		vhost_num=$1
		assert_number "$vhost_num"
	fi

	local vhost_pid_file="$(get_vhost_dir $vhost_num)/vhost.pid"

	if [[ ! -r $vhost_pid_file ]]; then
		warning "no vhost pid file found"
@@ -438,6 +497,7 @@ function vm_setup()
	local force_vm=""
	local guest_memory=1024
	local queue_number=""
	local vhost_dir="$(get_vhost_dir)"
	while getopts ':-:' optchar; do
		case "$optchar" in
			-)
@@ -453,6 +513,7 @@ function vm_setup()
				queue_num=*) local queue_number=${OPTARG#*=} ;;
				incoming=*) local vm_incoming="${OPTARG#*=}" ;;
				migrate-to=*) local vm_migrate_to="${OPTARG#*=}" ;;
				vhost-num=*) local vhost_dir="$(get_vhost_dir ${OPTARG#*=})" ;;
				*)
					error "unknown argument $OPTARG"
					return 1
@@ -627,13 +688,13 @@ function vm_setup()
				cmd+="-drive if=none,id=hd$i,file=$raw_disk,format=raw$raw_cache ${eol}"
				;;
			spdk_vhost_scsi)
				notice "using socket $SPDK_VHOST_SCSI_TEST_DIR/naa.$disk.$vm_num"
				cmd+="-chardev socket,id=char_$disk,path=$SPDK_VHOST_SCSI_TEST_DIR/naa.$disk.$vm_num ${eol}"
				notice "using socket $vhost_dir/naa.$disk.$vm_num"
				cmd+="-chardev socket,id=char_$disk,path=$vhost_dir/naa.$disk.$vm_num ${eol}"
				cmd+="-device vhost-user-scsi-pci,id=scsi_$disk,num_queues=$queue_number,chardev=char_$disk ${eol}"
				;;
			spdk_vhost_blk)
				notice "using socket $SPDK_VHOST_SCSI_TEST_DIR/naa.$disk.$vm_num"
				cmd+="-chardev socket,id=char_$disk,path=$SPDK_VHOST_SCSI_TEST_DIR/naa.$disk.$vm_num ${eol}"
				notice "using socket $vhost_dir/naa.$disk.$vm_num"
				cmd+="-chardev socket,id=char_$disk,path=$vhost_dir/naa.$disk.$vm_num ${eol}"
				cmd+="-device vhost-user-blk-pci,num-queues=$queue_number,chardev=char_$disk ${eol}"
				;;
			kernel_vhost)
@@ -960,12 +1021,17 @@ function run_fio()
#
function at_app_exit()
{
	local vhost_num

	notice "APP EXITING"
	notice "killing all VMs"
	vm_kill_all
	# Kill vhost application
	notice "killing vhost app"
	spdk_vhost_kill

	for vhost_num in $(spdk_vhost_list_all); do
		spdk_vhost_kill $vhost_num
	done

	notice "EXIT DONE"
}
+5 −1
Original line number Diff line number Diff line
@@ -4,6 +4,8 @@ BASE_DIR=$(readlink -f $(dirname $0))
[[ -z "$COMMON_DIR" ]] && COMMON_DIR="$(cd $BASE_DIR/../common && pwd)"
[[ -z "$TEST_DIR" ]] && TEST_DIR="$(cd $BASE_DIR/../../../../ && pwd)"

vhost_num=""

function usage()
{
	[[ ! -z $2 ]] && ( echo "$2"; echo ""; )
@@ -15,6 +17,7 @@ function usage()
	echo "    --gdbserver      Run app under gdb-server"
	echo "    --work-dir=PATH  Where to find source/project. [default=$TEST_DIR]"
	echo "    --conf-dir=PATH  Path to directory with configuration for vhost"
	echo "    --vhost-num=NUM  Optional: vhost instance NUM to start. Default: 0"

	exit 0
}
@@ -30,6 +33,7 @@ while getopts 'xh-:' optchar; do
				;;
			work-dir=*) TEST_DIR="${OPTARG#*=}" ;;
			conf-dir=*) CONF_DIR="${OPTARG#*=}" ;;
			vhost-num=*) vhost_num="${OPTARG}" ;;
			*) usage $0 echo "Invalid argument '$OPTARG'" ;;
		esac
		;;
@@ -49,4 +53,4 @@ notice ""
. $COMMON_DIR/common.sh

# Starting vhost with valid options
spdk_vhost_run $CONF_DIR
spdk_vhost_run $vhost_num --conf-path=$CONF_DIR
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ function usage()
	echo "                              orginal - use file directly. Will modify the provided file"
	echo "    --incoming=VM_NUM         Use VM_NUM as source migration VM."
	echo "    --migrate-to=VM_NUM       Use VM_NUM as target migration VM."
	echo "    --vhost-num=NUM       Optional: vhost instance NUM to be used by this VM. Default: 0"
	echo "-x                            Turn on script debug (set -x)"
	echo "-v                            Be more verbose"
	exit 0
+2 −2
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ if [[ $test_type =~ "spdk_vhost" ]]; then
	notice ""
	notice "running SPDK"
	notice ""
	spdk_vhost_run $BASE_DIR
	spdk_vhost_run --conf-path=$BASE_DIR
	notice ""
fi

@@ -91,7 +91,7 @@ notice ""
notice "Setting up VM"
notice ""

rpc_py="python $SPDK_BUILD_DIR/scripts/rpc.py "
rpc_py="python $SPDK_BUILD_DIR/scripts/rpc.py -s $(get_vhost_dir)/rpc.sock"

for vm_conf in ${vms[@]}; do
	IFS=',' read -ra conf <<< "$vm_conf"
Loading