diff --git a/autotest.sh b/autotest.sh index b86558c17..14e219c85 100755 --- a/autotest.sh +++ b/autotest.sh @@ -263,6 +263,7 @@ if [ $SPDK_RUN_FUNCTIONAL_TEST -eq 1 ]; then run_test "nvmf_identify_passthru" test/nvmf/target/identify_passthru.sh --transport=$SPDK_TEST_NVMF_TRANSPORT fi run_test "nvmf_dif" test/nvmf/target/dif.sh + run_test "nvmf_abort_qd_sizes" test/nvmf/target/abort_qd_sizes.sh elif [ "$SPDK_TEST_NVMF_TRANSPORT" = "fc" ]; then run_test "nvmf_fc" ./test/nvmf/nvmf.sh --transport=$SPDK_TEST_NVMF_TRANSPORT run_test "spdkcli_nvmf_fc" ./test/spdkcli/nvmf.sh diff --git a/test/nvmf/common.sh b/test/nvmf/common.sh index 7753c9156..4f8e33426 100644 --- a/test/nvmf/common.sh +++ b/test/nvmf/common.sh @@ -551,3 +551,73 @@ function remove_spdk_ns() { # Let it settle sleep 1 } + +configure_kernel_target() { + # Keep it global in scope for easier cleanup + kernel_name=${1:-kernel_target} + nvmet=/sys/kernel/config/nvmet + kernel_subsystem=$nvmet/subsystems/$kernel_name + kernel_namespace=$kernel_subsystem/namespaces/1 + kernel_port=$nvmet/ports/1 + + local block nvme + + if [[ ! -e /sys/module/nvmet ]]; then + modprobe nvmet + fi + + [[ -e $nvmet ]] + + "$rootdir/scripts/setup.sh" reset + + # Find nvme with an active ns device + for block in /sys/block/nvme*; do + [[ -e $block ]] || continue + block_in_use "${block##*/}" || nvme="/dev/${block##*/}" + done + + [[ -b $nvme ]] + + mkdir "$kernel_subsystem" + mkdir "$kernel_namespace" + mkdir "$kernel_port" + + # It allows only %llx value and for some reason kernel swaps the byte order + # so setting the serial is not very useful here + # "$kernel_subsystem/attr_serial" + echo "SPDK-$kernel_name" > "$kernel_subsystem/attr_model" + + echo 1 > "$kernel_subsystem/attr_allow_any_host" + echo "$nvme" > "$kernel_namespace/device_path" + echo 1 > "$kernel_namespace/enable" + + # By default use initiator ip which was set by nvmftestinit(). This is the + # interface which resides in the main net namespace and which is visible + # to nvmet. + + echo "$NVMF_INITIATOR_IP" > "$kernel_port/addr_traddr" + echo "$TEST_TRANSPORT" > "$kernel_port/addr_trtype" + echo "$NVMF_PORT" > "$kernel_port/addr_trsvcid" + echo ipv4 > "$kernel_port/addr_adrfam" + + # Enable the listener by linking the port to previously created subsystem + ln -s "$kernel_subsystem" "$kernel_port/subsystems/" + + # Check if target is available + nvme discover -a "$NVMF_INITIATOR_IP" -t "$TEST_TRANSPORT" -s "$NVMF_PORT" +} + +clean_kernel_target() { + [[ -e $kernel_subsystem ]] || return 0 + + echo 0 > "$kernel_namespace/enable" + + rm -f "$kernel_port/subsystems/$kernel_name" + rmdir "$kernel_namespace" + rmdir "$kernel_port" + rmdir "$kernel_subsystem" + + modules=(/sys/module/nvmet/holders/*) + + modprobe -r "${modules[@]##*/}" nvmet +} diff --git a/test/nvmf/target/abort_qd_sizes.sh b/test/nvmf/target/abort_qd_sizes.sh new file mode 100755 index 000000000..64e1c9295 --- /dev/null +++ b/test/nvmf/target/abort_qd_sizes.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash + +testdir=$(readlink -f "$(dirname "$0")") +rootdir=$(readlink -f "$testdir/../../../") + +# Set defaults we want to work with +set -- "--transport=tcp" "--iso" "$@" + +source "$rootdir/test/common/autotest_common.sh" +source "$rootdir/test/nvmf/common.sh" + +shopt -s nullglob + +rabort() { + local trtype=$1 + local adrfam=$2 + local traddr=$3 + local trsvcid=$4 + local subnqn=$5 + + local qds qd + local target r + + qds=(4 24 64) + + for r in trtype adrfam traddr trsvcid subnqn; do + target=${target:+$target }$r:${!r} + done + + for qd in "${qds[@]}"; do + "$SPDK_EXAMPLE_DIR/abort" \ + -q "$qd" \ + -w rw \ + -M 50 \ + -o 4096 \ + -r "$target" + done +} + +spdk_target() { + local name=spdk_target + local subnqn=nqn.2016-06.io.spdk:$name + + rpc_cmd bdev_nvme_attach_controller -t pcie -a "$nvme" -b "$name" + + rpc_cmd nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 + rpc_cmd nvmf_create_subsystem "$subnqn" -a -s "$NVMF_SERIAL" + rpc_cmd nvmf_subsystem_add_ns "$subnqn" "${name}n1" + rpc_cmd nvmf_subsystem_add_listener "$subnqn" -t "$TEST_TRANSPORT" -a "$NVMF_FIRST_TARGET_IP" -s "$NVMF_PORT" + + rabort "$TEST_TRANSPORT" IPv4 "$NVMF_FIRST_TARGET_IP" "$NVMF_PORT" "$subnqn" + + rpc_cmd nvmf_delete_subsystem "$subnqn" + rpc_cmd bdev_nvme_detach_controller "$name" +} + +kernel_target() { + local name=kernel_target + + configure_kernel_target "$name" + rabort "$TEST_TRANSPORT" IPv4 "$NVMF_INITIATOR_IP" "$NVMF_PORT" "$name" + clean_kernel_target +} + +nvmftestinit +nvmfappstart -m 0xf + +trap 'process_shm --id $NVMF_APP_SHM_ID || :; nvmftestfini || :; clean_kernel_target' SIGINT SIGTERM EXIT + +mapfile -t nvmes < <(nvme_in_userspace) +((${#nvmes[@]} > 0)) + +nvme=${nvmes[0]} + +run_test "spdk_target_abort" spdk_target +run_test "kernel_target_abort" kernel_target + +trap - SIGINT SIGTERM EXIT +nvmftestfini