diff --git a/autotest.sh b/autotest.sh
index 6bfbe0c68..acace47a3 100755
--- a/autotest.sh
+++ b/autotest.sh
@@ -151,13 +151,13 @@ if [ $SPDK_TEST_VHOST -eq 1 ]; then
run_test ./test/vhost/spdk_vhost.sh --integrity
timing_exit integrity
- # timing_enter fs_integrity_scsi
- # run_test ./test/vhost/spdk_vhost.sh --fs-integrity-scsi
- # timing_exit fs_integrity_scsi
+ timing_enter fs_integrity_scsi
+ run_test ./test/vhost/spdk_vhost.sh --fs-integrity-scsi
+ timing_exit fs_integrity_scsi
- # timing_enter fs_integrity_blk
- # run_test ./test/vhost/spdk_vhost.sh --fs-integrity-blk
- # timing_exit fs_integrity_blk
+ timing_enter fs_integrity_blk
+ run_test ./test/vhost/spdk_vhost.sh --fs-integrity-blk
+ timing_exit fs_integrity_blk
timing_enter integrity_lvol_scsi_nightly
run_test ./test/vhost/spdk_vhost.sh --integrity-lvol-scsi-nightly
diff --git a/test/vhost/integrity/base_vm.xml b/test/vhost/integrity/base_vm.xml
deleted file mode 100644
index cdf7aea29..000000000
--- a/test/vhost/integrity/base_vm.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
- 4
- 4
- 8
-
- hvm
-
-
-
-
-
-
-
-
-
-
-
- destroy
- restart
- destroy
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/test/vhost/integrity/base_vnet.xml b/test/vhost/integrity/base_vnet.xml
deleted file mode 100644
index 08324dcb2..000000000
--- a/test/vhost/integrity/base_vnet.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/test/vhost/integrity/integrity_start.sh b/test/vhost/integrity/integrity_start.sh
index 013cfbeca..0f089e2c6 100755
--- a/test/vhost/integrity/integrity_start.sh
+++ b/test/vhost/integrity/integrity_start.sh
@@ -1,186 +1,93 @@
#!/usr/bin/env bash
+set -e
-set -xe
+ctrl_type="spdk_vhost_scsi"
+vm_fs="ext4"
-: ${QEMU_PREFIX="/usr/local/qemu/spdk-2.12-pre"}
-
-basedir=$(readlink -f $(dirname $0))
-rootdir=$(readlink -f $basedir/../../..)
-testdir=$(readlink -f $rootdir/..)
-MAKE="make -j$(( $(nproc) * 2 ))"
-
-rpc_py="python $rootdir/scripts/rpc.py -s $(get_vhost_dir)/rpc.sock"
-HOST_IP=192.200.200.1
-VM_IP=192.200.200.254
-VM_UNAME="root"
-VM_PASS="root"
-VM_NAME="int_test_vm"
-VM_NET_NAME="int_test_net"
-VM_MAC="02:de:ad:de:ad:01"
-VM_BAK_IMG="/tmp/int_test_backing.img"
-TIMEO=60
-SSHCMD="sshpass -p $VM_PASS ssh"
-SCPCMD="sshpass -p $VM_PASS scp"
-
-while getopts 'i:m:f:' optchar; do
- case $optchar in
- i) VM_IMG="${OPTARG#*=}" ;;
- m) VHOST_MODE="${OPTARG#*=}" ;;
- f) VM_FS="${OPTARG#*=}" ;;
- esac
-done
-
-source $rootdir/test/common/autotest_common.sh
-
-if [ -z "$VM_IMG" ]; then
- echo "ERROR: VM_IMG: path to qcow2 image not provided - not running"
- exit 1
-fi
-
-if [ -z "$VHOST_MODE" ]; then
- echo "ERROR: VHOST_MODE: please specify Vhost mode - scsi or blk"
-fi
-
-if [ -z "$VM_FS" ]; then
- VM_FS="ext4"
- echo "INFO: Using default value for filesystem: $VM_FS"
-fi
-
-# Check if Qemu binary is present
-if [[ -z $VM_QEMU ]]; then
- VM_QEMU="$QEMU_PREFIX/bin/qemu-system-x86_64"
-fi
-
-if [[ ! -x $VM_QEMU ]]; then
- echo "ERROR: QEMU binary not present in $VM_QEMU"
-fi
-
-if [[ -z $QEMU_IMG ]]; then
- QEMU_IMG="$QEMU_PREFIX/bin/qemu-img"
-fi
-
-echo "Running test with filesystem: $VM_FS"
-
-function cleanup_virsh() {
- if virsh domstate $VM_NAME; then
- virsh shutdown $VM_NAME
- for timeo in `seq 0 10`; do
- if ! virsh domstate $VM_NAME; then
- break
- fi
- if [[ $timeo -eq 10 ]]; then
- echo "ERROR: VM did not shutdown, killing!"
- virsh destroy $VM_NAME
- fi
- sleep 1
- done
- fi
-
- if virsh net-info $VM_NET_NAME; then
- virsh net-destroy $VM_NET_NAME
- fi
- rm $VM_BAK_IMG || true
+function usage()
+{
+ [[ ! -z $2 ]] && ( echo "$2"; echo ""; )
+ echo "Shortcut script for doing automated test"
+ echo "Usage: $(basename $1) [OPTIONS]"
+ echo
+ echo "-h, --help Print help and exit"
+ echo " --work-dir=WORK_DIR Workspace for the test to run"
+ echo " --ctrl-type=TYPE Controller type to use for test:"
+ echo " spdk_vhost_scsi - use spdk vhost scsi"
+ echo " --fs=FS_LIST Filesystems to use for test in VM:"
+ echo " Example: --fs=\"ext4 ntfs ext2\""
+ echo " Default: ext4"
+ echo " spdk_vhost_blk - use spdk vhost block"
+ echo "-x set -x for script debug"
+ exit 0
}
-function cleanup_lvol() {
- echo "INFO: Removing lvol bdevs"
- $rpc_py delete_bdev $lb_name
- echo -e "\tINFO: lvol bdev $lb_name removed"
-
- echo "INFO: Removing lvol stores"
- $rpc_py destroy_lvol_store -u $lvol_store
- echo -e "\tINFO: lvol stote $lvol_store removed"
+function clean_lvol_cfg()
+{
+ notice "Removing lvol bdev and lvol store"
+ $rpc_py delete_bdev lvol_store/lvol_bdev
+ $rpc_py destroy_lvol_store -l lvol_store
}
-timing_enter integrity_test
-
-# Backing image for VM
-"$QEMU_IMG" create -f qcow2 -o backing_file=$VM_IMG $VM_BAK_IMG
-
-# Prepare vhost config
-cp $basedir/vhost.conf.in $basedir/vhost.conf
-$rootdir/scripts/gen_nvme.sh >> $basedir/vhost.conf
-
-# Prepare .xml files for Virsh
-cp $basedir/base_vm.xml $basedir/vm_conf.xml
-cp $basedir/base_vnet.xml $basedir/vnet_conf.xml
-sed -i "s@@$VM_NAME@g" $basedir/vm_conf.xml
-sed -i "s@source file=''@source file='$VM_BAK_IMG'@g" $basedir/vm_conf.xml
-sed -i "s@@$VM_QEMU@g" $basedir/vm_conf.xml
-sed -i "s@mac address=''@mac address='$VM_MAC'@g" $basedir/vm_conf.xml
-sed -i "s@source network=''@source network='$VM_NET_NAME'@g" $basedir/vm_conf.xml
-sed -i "s@@$VM_NET_NAME@g" $basedir/vnet_conf.xml
-if [[ "$VHOST_MODE" == "scsi" ]]; then
- sed -i "s@vhost_dev_args@vhost-user-scsi-pci,id=scsi0@g" $basedir/vm_conf.xml
-else
- sed -i "s@vhost_dev_args@vhost-user-blk-pci@g" $basedir/vm_conf.xml
-fi
-
-trap "cleanup_virsh; killprocess $pid; exit 1" SIGINT SIGTERM EXIT
-
-virsh net-create $basedir/vnet_conf.xml
-
-# Change directory and ownership because virsh has issues with
-# paths that are in /root tree
-cd /tmp
-$rootdir/app/vhost/vhost -c $basedir/vhost.conf &
-pid=$!
-echo "Process pid: $pid"
-waitforlisten "$pid"
-
-lvol_store=$($rpc_py construct_lvol_store Nvme0n1 lvs_0)
-free_mb=$(get_lvs_free_mb "$lvol_store")
-lb_name=$($rpc_py construct_lvol_bdev -u $lvol_store lbd_0 $free_mb)
-
-if [[ "$VHOST_MODE" == "scsi" ]]; then
- $rpc_py construct_vhost_scsi_controller naa.0
- $rpc_py add_vhost_scsi_lun naa.0 0 $lb_name
-else
- $rpc_py construct_vhost_blk_controller naa.0 $lb_name
-fi
-
-trap "cleanup_lvol; cleanup_virsh; killprocess $pid; exit 1" SIGINT SIGTERM EXIT ERR
-
-chmod 777 /tmp/naa.0
-
-virsh create $basedir/vm_conf.xml
-virsh net-update $VM_NET_NAME add ip-dhcp-host ""
-
-# Wait for VM to boot
-echo "INFO: Trying to connect to virtual machine..."
-while ! $SSHCMD root@$VM_IP -q -oStrictHostKeyChecking=no 'echo Hello'; do
- sleep 1
- if ! (( TIMEO-=1 ));then
- echo "ERROR: VM did not boot properly, exiting"
- exit 1
- fi
+while getopts 'xh-:' optchar; do
+ case "$optchar" in
+ -)
+ case "$OPTARG" in
+ help) usage $0 ;;
+ ctrl-type=*) ctrl_type="${OPTARG#*=}" ;;
+ fs=*) vm_fs="${OPTARG#*=}" ;;
+ *) usage $0 "Invalid argument '$OPTARG'" ;;
+ esac
+ ;;
+ h) usage $0 ;;
+ x) set -x
+ x="-x" ;;
+ *) usage $0 "Invalid argument '$OPTARG'"
+ esac
done
-# Run test on Virtual Machine
-$SCPCMD -r $basedir/integrity_vm.sh root@$VM_IP:~
-$SSHCMD root@$VM_IP "fs=$VM_FS ~/integrity_vm.sh $VHOST_MODE"
+. $(readlink -e "$(dirname $0)/../common/common.sh") || exit 1
+rpc_py="python $SPDK_BUILD_DIR/scripts/rpc.py -s $(get_vhost_dir)/rpc.sock"
-# Kill VM, cleanup config files
-cleanup_virsh
-rm $basedir/vm_conf.xml || true
-rm $basedir/vnet_conf.xml || true
-rm $basedir/vhost.conf || true
+trap 'error_exit "${FUNCNAME}" "${LINENO}"' SIGTERM SIGABRT ERR
-# Delete lvol bdev, destroy lvol store
-cleanup_lvol
+# Try to kill if any VM remains from previous runs
+vm_kill_all
-# Try to gracefully stop spdk vhost
-if /bin/kill -INT $pid; then
- while /bin/kill -0 $pid; do
- sleep 1
- done
-elif /bin/kill -0 $pid; then
- killprocess $pid
- echo "ERROR: Vhost was not closed gracefully..."
- exit 1
-else
- exit 1
+notice "Starting SPDK vhost"
+spdk_vhost_run --conf-path=$BASE_DIR
+notice "..."
+
+# Set up lvols and vhost controllers
+trap 'clean_lvol_cfg; error_exit "${FUNCNAME}" "${LINENO}"' SIGTERM SIGABRT ERR
+notice "Constructing lvol store and lvol bdev on top of Nvme0n1"
+lvs_uuid=$($rpc_py construct_lvol_store Nvme0n1 lvol_store)
+$rpc_py construct_lvol_bdev lvol_bdev 10000 -l lvol_store
+
+if [[ "$ctrl_type" == "spdk_vhost_scsi" ]]; then
+ $rpc_py construct_vhost_scsi_controller naa.Nvme0n1.0
+ $rpc_py add_vhost_scsi_lun naa.Nvme0n1.0 0 lvol_store/lvol_bdev
+elif [[ "$ctrl_type" == "spdk_vhost_blk" ]]; then
+ $rpc_py construct_vhost_blk_controller naa.Nvme0n1.0 lvol_store/lvol_bdev
fi
-trap - SIGINT SIGTERM EXIT
-timing_exit integrity_test
+# Set up and run VM
+setup_cmd="vm_setup --disk-type=$ctrl_type --force=0"
+setup_cmd+=" --os=/home/sys_sgsw/vhost_vm_image.qcow2"
+setup_cmd+=" --disks=Nvme0n1"
+$setup_cmd
+
+# Run VM
+vm_run 0
+vm_wait_for_boot 600 0
+
+# Run tests on VM
+vm_scp 0 $BASE_DIR/integrity_vm.sh root@127.0.0.1:/root/integrity_vm.sh
+vm_ssh 0 "~/integrity_vm.sh $ctrl_type \"$vm_fs\""
+
+notice "Shutting down virtual machine..."
+vm_shutdown_all
+
+clean_lvol_cfg
+notice "Shutting down SPDK vhost app..."
+spdk_vhost_kill
diff --git a/test/vhost/integrity/integrity_vm.sh b/test/vhost/integrity/integrity_vm.sh
index 041ff5f32..7a4b3a4a6 100755
--- a/test/vhost/integrity/integrity_vm.sh
+++ b/test/vhost/integrity/integrity_vm.sh
@@ -4,63 +4,66 @@ set -xe
basedir=$(readlink -f $(dirname $0))
MAKE="make -j$(( $(nproc) * 2 ))"
-if [[ $1 == "scsi" ]]; then
- devs=""
- for entry in /sys/block/sd*; do
- if grep -Eq '(INTEL|RAWSCSI|LIO-ORG)' $entry/device/vendor; then
- devs+="$(basename $entry)"
- fi
- done
-else script=$blk_script;
- devs=$(cd /sys/block; echo vd*)
+if [[ $1 == "spdk_vhost_scsi" ]]; then
+ devs=""
+ for entry in /sys/block/sd*; do
+ if grep -Eq '(INTEL|RAWSCSI|LIO-ORG)' $entry/device/vendor; then
+ devs+="$(basename $entry) "
+ fi
+ done
+elif [[ $1 == "spdk_vhost_blk" ]]; then
+ devs=$(cd /sys/block; echo vd*)
fi
+fs=$2
+
trap "exit 1" SIGINT SIGTERM EXIT
for fs in $fs; do
- for dev in $devs; do
- mkfs_cmd="mkfs.$fs"
- parted_cmd="parted -s /dev/${dev}"
+ for dev in $devs; do
+ parted_cmd="parted -s /dev/${dev}"
- echo "INFO: Creating partition table on disk using: $parted_cmd mklabel gpt"
- $parted_cmd mklabel gpt
- $parted_cmd mkpart primary 2048s 100%
- sleep 2
+ echo "INFO: Creating partition table on disk using: $parted_cmd mklabel gpt"
+ $parted_cmd mklabel gpt
+ $parted_cmd mkpart primary 2048s 100%
+ sleep 2
- mkfs_cmd+=" /dev/${dev}1"
- echo "INFO: Creating filesystem using: $mkfs_cmd"
- wipefs -a /dev/${dev}1
- $mkfs_cmd
+ mkfs_cmd="mkfs.$fs"
+ if [[ $fs == "ntfs" ]]; then
+ mkfs_cmd+=" -f"
+ fi
+ mkfs_cmd+=" /dev/${dev}1"
+ echo "INFO: Creating filesystem using: $mkfs_cmd"
+ wipefs -a /dev/${dev}1
+ $mkfs_cmd
- mkdir -p /mnt/${dev}dir
- mount -o sync /dev/${dev}1 /mnt/${dev}dir
- mkdir -p /mnt/${dev}dir/linux-src
- tar xf $basedir/linux-src.tar.gz -C /mnt/${dev}dir/linux-src --strip-components=1
- sleep 2
+ mkdir -p /mnt/${dev}dir
+ mount -o sync /dev/${dev}1 /mnt/${dev}dir
- # Now build SPDK
- $MAKE -C /mnt/${dev}dir/linux-src defconfig
- $MAKE -C /mnt/${dev}dir/linux-src
- # Print out space consumed on target device
- df -h /dev/$dev
- rm -rf /mnt/${dev}dir/linux-src
- done
+ fio --name="integrity" --bsrange=4k-512k --iodepth=128 --numjobs=1 --direct=1 \
+ --thread=1 --group_reporting=1 --rw=randrw --rwmixread=70 \
+ --filename=/mnt/${dev}dir/test_file --verify=md5 --do_verify=1 \
+ --verify_backlog=1024 --fsync_on_close=1 --runtime=20 --time_based=1 --size=1G
- for dev in $devs; do
- umount /mnt/${dev}dir
- rm -rf /mnt/${dev}dir
+ # Print out space consumed on target device
+ df -h /dev/$dev
+ done
- stats=( $(cat /sys/block/$dev/stat) )
- echo ""
- echo "$dev stats"
- printf "READ IO cnt: % 8u merges: % 8u sectors: % 8u ticks: % 8u\n" \
- ${stats[0]} ${stats[1]} ${stats[2]} ${stats[3]}
- printf "WRITE IO cnt: % 8u merges: % 8u sectors: % 8u ticks: % 8u\n" \
- ${stats[4]} ${stats[5]} ${stats[6]} ${stats[7]}
- printf "in flight: % 8u io ticks: % 8u time in queue: % 8u\n" \
- ${stats[8]} ${stats[9]} ${stats[10]}
- echo ""
- done
+ for dev in $devs; do
+ umount /mnt/${dev}dir
+ rm -rf /mnt/${dev}dir
+
+ stats=( $(cat /sys/block/$dev/stat) )
+ echo ""
+ echo "$dev stats"
+ printf "READ IO cnt: % 8u merges: % 8u sectors: % 8u ticks: % 8u\n" \
+ ${stats[0]} ${stats[1]} ${stats[2]} ${stats[3]}
+ printf "WRITE IO cnt: % 8u merges: % 8u sectors: % 8u ticks: % 8u\n" \
+ ${stats[4]} ${stats[5]} ${stats[6]} ${stats[7]}
+ printf "in flight: % 8u io ticks: % 8u time in queue: % 8u\n" \
+ ${stats[8]} ${stats[9]} ${stats[10]}
+ echo ""
+ done
done
trap - SIGINT SIGTERM EXIT
diff --git a/test/vhost/spdk_vhost.sh b/test/vhost/spdk_vhost.sh
index 867a3299b..8e3d7dd74 100755
--- a/test/vhost/spdk_vhost.sh
+++ b/test/vhost/spdk_vhost.sh
@@ -104,13 +104,13 @@ case $1 in
report_test_completion "nightly_vhost_integrity_blk"
;;
-fs|--fs-integrity-scsi)
- echo 'Running filesystem integrity suite...'
- $WORKDIR/integrity/integrity_start.sh -i $VM_IMAGE -m scsi -f "xfs ntfs btrfs ext4"
+ echo 'Running filesystem integrity suite with SCSI...'
+ $WORKDIR/integrity/integrity_start.sh --ctrl-type=spdk_vhost_scsi --fs="xfs ntfs btrfs ext4"
report_test_completion "vhost_fs_integrity_scsi"
;;
-fb|--fs-integrity-blk)
- echo 'Running filesystem integrity suite...'
- $WORKDIR/integrity/integrity_start.sh -i $VM_IMAGE -m blk -f "xfs ntfs btrfs ext4"
+ echo 'Running filesystem integrity suite with BLK...'
+ $WORKDIR/integrity/integrity_start.sh --ctrl-type=spdk_vhost_blk --fs="xfs ntfs btrfs ext4"
report_test_completion "vhost_fs_integrity_blk"
;;
-ils|--integrity-lvol-scsi)
diff --git a/test/vhost/test_plan.md b/test/vhost/test_plan.md
index 7f2b9b58b..b412436a8 100644
--- a/test/vhost/test_plan.md
+++ b/test/vhost/test_plan.md
@@ -41,8 +41,9 @@
#### Filesystem integrity
- runs SPDK with 1 VM with 1 NVMe device attached.
- creates a partition table and filesystem on passed device, and mounts it
-- runs Linux kernel source compilation
-- Tested file systems: ext2, ext3, ext4, brtfs, ntfs, fat
+- 1GB test file is created on mounted file system and FIO randrw traffic
+ (with enabled verification) is run
+- Tested file systems: ext4, brtfs, ntfs, xfs
- runs against vhost scsi and vhost blk
#### Windows HCK SCSI Compliance Test 2.0.