SPDK test script can fail during any point of the execution. To keep using the same devices between test runs in CI, those devices have to be cleaned between runs. To select device for tests or to clean before tests, the partition table and lack of mount points is used. SPDK GPT partitions were always considered not in use. Meanwhile Linux GPT were not, even if lacking a mount point. Some of the SPDK tests create Linux GPT partitions, which might remain after a test run. Linux GPT partitions created during tests now contain "SPDK_TEST" as part of their partition name. This allows marking such block devices as 'not in use', to be cleaned and used in further SPDK test. fixes #2345 Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com> Change-Id: I0098776239da9b0c5dcc748625485284e4863525 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11220 Reviewed-by: Michal Berger <michallinuxstuff@gmail.com> Reviewed-by: Dong Yi <dongx.yi@intel.com> Reviewed-by: Pawel Piatek <pawelx.piatek@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
148 lines
4.7 KiB
Bash
Executable File
148 lines
4.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
testdir=$(readlink -f $(dirname $0))
|
|
rootdir=$(readlink -f $testdir/../..)
|
|
source $rootdir/scripts/common.sh
|
|
source $rootdir/test/common/autotest_common.sh
|
|
|
|
function nvme_identify() {
|
|
$SPDK_EXAMPLE_DIR/identify -i 0
|
|
for bdf in $(get_nvme_bdfs); do
|
|
$SPDK_EXAMPLE_DIR/identify -r "trtype:PCIe traddr:${bdf}" -i 0
|
|
done
|
|
timing_exit identify
|
|
}
|
|
|
|
function nvme_perf() {
|
|
# enable no shutdown notification option
|
|
$SPDK_EXAMPLE_DIR/perf -q 128 -w read -o 12288 -t 1 -LL -i 0 -N
|
|
$SPDK_EXAMPLE_DIR/perf -q 128 -w write -o 12288 -t 1 -LL -i 0
|
|
if [ -b /dev/ram0 ]; then
|
|
# Test perf with AIO device
|
|
$SPDK_EXAMPLE_DIR/perf /dev/ram0 -q 128 -w read -o 12288 -t 1 -LL -i 0
|
|
fi
|
|
}
|
|
|
|
function nvme_fio_test() {
|
|
PLUGIN_DIR=$rootdir/examples/nvme/fio_plugin
|
|
ran_fio=false
|
|
for bdf in $(get_nvme_bdfs); do
|
|
if ! "$SPDK_EXAMPLE_DIR/identify" -r "trtype:PCIe traddr:${bdf}" | grep -qE "^Namespace ID:[0-9]+"; then
|
|
continue
|
|
fi
|
|
if $SPDK_EXAMPLE_DIR/identify -r "trtype:PCIe traddr:${bdf}" | grep -q "Extended Data LBA"; then
|
|
bs=4160
|
|
else
|
|
bs=4096
|
|
fi
|
|
fio_nvme $PLUGIN_DIR/example_config.fio --filename="trtype=PCIe traddr=${bdf//:/.}" --bs="$bs"
|
|
ran_fio=true
|
|
done
|
|
$ran_fio || (echo "No valid NVMe drive found. Failing test." && false)
|
|
}
|
|
|
|
function nvme_multi_secondary() {
|
|
# Primary process exits last
|
|
$SPDK_EXAMPLE_DIR/perf -i 0 -q 16 -w read -o 4096 -t 5 -c 0x1 &
|
|
pid0=$!
|
|
$SPDK_EXAMPLE_DIR/perf -i 0 -q 16 -w read -o 4096 -t 3 -c 0x2 &
|
|
pid1=$!
|
|
$SPDK_EXAMPLE_DIR/perf -i 0 -q 16 -w read -o 4096 -t 3 -c 0x4
|
|
wait $pid0
|
|
wait $pid1
|
|
|
|
# Secondary process exits last
|
|
$SPDK_EXAMPLE_DIR/perf -i 0 -q 16 -w read -o 4096 -t 3 -c 0x1 &
|
|
pid0=$!
|
|
$SPDK_EXAMPLE_DIR/perf -i 0 -q 16 -w read -o 4096 -t 3 -c 0x2 &
|
|
pid1=$!
|
|
$SPDK_EXAMPLE_DIR/perf -i 0 -q 16 -w read -o 4096 -t 5 -c 0x4
|
|
wait $pid0
|
|
wait $pid1
|
|
}
|
|
|
|
if [ $(uname) = Linux ]; then
|
|
# check that our setup.sh script does not bind NVMe devices to uio/vfio if they
|
|
# have an active mountpoint
|
|
$rootdir/scripts/setup.sh reset
|
|
blkname=''
|
|
# first, find an NVMe device that does not have an active mountpoint already;
|
|
# this covers rare case where someone is running this test script on a system
|
|
# that has a mounted NVMe filesystem
|
|
#
|
|
# note: more work probably needs to be done to properly handle devices with multiple
|
|
# namespaces
|
|
for bdf in $(get_nvme_bdfs); do
|
|
for name in $(get_nvme_name_from_bdf $bdf); do
|
|
if [ "$name" != "" ]; then
|
|
mountpoints=$(lsblk /dev/$name --output MOUNTPOINT -n | wc -w)
|
|
if [ "$mountpoints" = "0" ]; then
|
|
blkname=$name
|
|
break 2
|
|
fi
|
|
fi
|
|
done
|
|
done
|
|
|
|
# if we found an NVMe block device without an active mountpoint, create and mount
|
|
# a filesystem on it for purposes of testing the setup.sh script
|
|
if [ "$blkname" != "" ]; then
|
|
parted -s /dev/$blkname mklabel gpt
|
|
# just create a 100MB partition - this tests our ability to detect mountpoints
|
|
# on partitions of the device, not just the device itself; it also is faster
|
|
# since we don't trim and initialize the whole namespace
|
|
parted -s /dev/$blkname mkpart SPDK_TEST 1 100
|
|
sleep 1
|
|
mkfs.ext4 -F /dev/${blkname}p1
|
|
mkdir -p /tmp/nvmetest
|
|
mount /dev/${blkname}p1 /tmp/nvmetest
|
|
sleep 1
|
|
$rootdir/scripts/setup.sh
|
|
driver=$(basename $(readlink /sys/bus/pci/devices/$bdf/driver))
|
|
# check that the nvme driver is still loaded against the device
|
|
if [ "$driver" != "nvme" ]; then
|
|
exit 1
|
|
fi
|
|
umount /tmp/nvmetest
|
|
rmdir /tmp/nvmetest
|
|
# write zeroes to the device to blow away the partition table and filesystem
|
|
dd if=/dev/zero of=/dev/$blkname oflag=direct bs=1M count=1
|
|
$rootdir/scripts/setup.sh
|
|
driver=$(basename $(readlink /sys/bus/pci/devices/$bdf/driver))
|
|
# check that the nvme driver is not loaded against the device
|
|
if [ "$driver" = "nvme" ]; then
|
|
exit 1
|
|
fi
|
|
else
|
|
$rootdir/scripts/setup.sh
|
|
fi
|
|
fi
|
|
|
|
if [ $(uname) = Linux ]; then
|
|
trap "kill_stub -9; exit 1" SIGINT SIGTERM EXIT
|
|
start_stub "-s 4096 -i 0 -m 0xE"
|
|
fi
|
|
|
|
run_test "nvme_reset" $testdir/reset/reset -q 64 -w write -s 4096 -t 5
|
|
run_test "nvme_identify" nvme_identify
|
|
run_test "nvme_perf" nvme_perf
|
|
run_test "nvme_hello_world" $SPDK_EXAMPLE_DIR/hello_world -i 0
|
|
run_test "nvme_deallocated_value" $testdir/deallocated_value/deallocated_value -i 0
|
|
run_test "nvme_sgl" $testdir/sgl/sgl
|
|
run_test "nvme_e2edp" $testdir/e2edp/nvme_dp
|
|
run_test "nvme_reserve" $testdir/reserve/reserve
|
|
run_test "nvme_err_injection" $testdir/err_injection/err_injection
|
|
run_test "nvme_overhead" $testdir/overhead/overhead -s 4096 -t 1 -H -i 0
|
|
run_test "nvme_arbitration" $SPDK_EXAMPLE_DIR/arbitration -t 3 -i 0
|
|
|
|
if [ $(uname) != "FreeBSD" ]; then
|
|
run_test "nvme_startup" $testdir/startup/startup -t 1000000
|
|
run_test "nvme_multi_secondary" nvme_multi_secondary
|
|
trap - SIGINT SIGTERM EXIT
|
|
kill_stub
|
|
fi
|
|
|
|
if [[ $CONFIG_FIO_PLUGIN == y ]]; then
|
|
run_test "nvme_fio" nvme_fio_test
|
|
fi
|