summaryrefslogtreecommitdiffstats
path: root/src/spdk/test/nvme/nvme.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/spdk/test/nvme/nvme.sh')
-rwxr-xr-xsrc/spdk/test/nvme/nvme.sh187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/spdk/test/nvme/nvme.sh b/src/spdk/test/nvme/nvme.sh
new file mode 100755
index 00000000..c52b926e
--- /dev/null
+++ b/src/spdk/test/nvme/nvme.sh
@@ -0,0 +1,187 @@
+#!/usr/bin/env bash
+
+set -e
+
+testdir=$(readlink -f $(dirname $0))
+rootdir=$(readlink -f $testdir/../..)
+source $rootdir/scripts/common.sh
+source $rootdir/test/common/autotest_common.sh
+
+function get_nvme_name_from_bdf {
+ lsblk -d --output NAME
+ nvme_devs=$(lsblk -d --output NAME | grep "^nvme") || true
+ if [ -z "$nvme_devs" ]; then
+ return
+ fi
+ for dev in $nvme_devs; do
+ link_name=$(readlink /sys/block/$dev/device/device) || true
+ if [ -z "$link_name" ]; then
+ link_name=$(readlink /sys/block/$dev/device)
+ fi
+ bdf=$(basename "$link_name")
+ if [ "$bdf" = "$1" ]; then
+ eval "$2=$dev"
+ return
+ fi
+ done
+}
+
+timing_enter nvme
+
+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
+ # give kernel nvme driver some time to create the block devices before we start looking for them
+ sleep 1
+ 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 $(iter_pci_class_code 01 08 02); do
+ get_nvme_name_from_bdf "$bdf" blkname
+ if [ "$blkname" != "" ]; then
+ mountpoints=$(lsblk /dev/$blkname --output MOUNTPOINT -n | wc -w)
+ if [ "$mountpoints" = "0" ]; then
+ break
+ else
+ blkname=''
+ fi
+ fi
+ 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 primary 1 100
+ sleep 1
+ mkfs.ext4 -F /dev/${blkname}p1
+ mkdir -p /tmp/nvmetest
+ mount /dev/${blkname}p1 /tmp/nvmetest
+ $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
+ start_stub "-s 4096 -i 0 -m 0xF"
+ trap "kill_stub; exit 1" SIGINT SIGTERM EXIT
+fi
+
+if [ $RUN_NIGHTLY -eq 1 ]; then
+ # TODO: temporarily disabled - temperature AER doesn't fire on emulated controllers
+ #timing_enter aer
+ #$testdir/aer/aer
+ #timing_exit aer
+
+ timing_enter reset
+ $testdir/reset/reset -q 64 -w write -s 4096 -t 2
+ report_test_completion "nightly_nvme_reset"
+ timing_exit reset
+fi
+
+timing_enter identify
+$rootdir/examples/nvme/identify/identify -i 0
+for bdf in $(iter_pci_class_code 01 08 02); do
+ $rootdir/examples/nvme/identify/identify -r "trtype:PCIe traddr:${bdf}" -i 0
+done
+timing_exit identify
+
+timing_enter perf
+$rootdir/examples/nvme/perf/perf -q 128 -w read -o 12288 -t 1 -LL -i 0
+if [ -b /dev/ram0 ]; then
+ # Test perf with AIO device
+ $rootdir/examples/nvme/perf/perf /dev/ram0 -q 128 -w read -o 12288 -t 1 -LL -i 0
+ report_test_completion "nvme_perf"
+fi
+timing_exit perf
+
+timing_enter reserve
+$rootdir/examples/nvme/reserve/reserve
+timing_exit reserve
+
+timing_enter hello_world
+$rootdir/examples/nvme/hello_world/hello_world
+timing_exit
+
+timing_enter deallocated_value
+$testdir/deallocated_value/deallocated_value
+timing_exit deallocated_value
+
+timing_enter sgl
+$testdir/sgl/sgl
+timing_exit sgl
+
+timing_enter e2edp
+$testdir/e2edp/nvme_dp
+timing_exit e2edp
+
+timing_enter err_injection
+$testdir/err_injection/err_injection
+timing_exit err_injection
+
+timing_enter overhead
+$testdir/overhead/overhead -s 4096 -t 1 -H
+timing_exit overhead
+
+timing_enter arbitration
+$rootdir/examples/nvme/arbitration/arbitration -t 3 -i 0
+timing_exit arbitration
+
+if [ `uname` = Linux ]; then
+ timing_enter multi_secondary
+ $rootdir/examples/nvme/perf/perf -i 0 -q 16 -w read -o 4096 -t 3 -c 0x1 &
+ pid0=$!
+ $rootdir/examples/nvme/perf/perf -i 0 -q 16 -w read -o 4096 -t 3 -c 0x2 &
+ pid1=$!
+ $rootdir/examples/nvme/perf/perf -i 0 -q 16 -w read -o 4096 -t 3 -c 0x4
+ wait $pid0
+ wait $pid1
+ report_test_completion "nvme_multi_secondary"
+ timing_exit multi_secondary
+fi
+
+if [ `uname` = Linux ]; then
+ trap - SIGINT SIGTERM EXIT
+ kill_stub
+fi
+PLUGIN_DIR=$rootdir/examples/nvme/fio_plugin
+
+if [ -d /usr/src/fio ]; then
+ timing_enter fio_plugin
+ for bdf in $(iter_pci_class_code 01 08 02); do
+ # Only test when ASAN is not enabled. If ASAN is enabled, we cannot test.
+ if [ $SPDK_RUN_ASAN -eq 0 ]; then
+ LD_PRELOAD=$PLUGIN_DIR/fio_plugin /usr/src/fio/fio $PLUGIN_DIR/example_config.fio --filename="trtype=PCIe traddr=${bdf//:/.} ns=1"
+ report_test_completion "bdev_fio"
+ fi
+ break
+ done
+
+ timing_exit fio_plugin
+fi
+
+timing_exit nvme