2020-03-04 13:28:36 +00:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
testdir=$(readlink -f $(dirname $0))
|
2020-06-08 11:42:52 +00:00
|
|
|
rootdir=$(readlink -f $testdir/../../..)
|
2020-03-04 13:28:36 +00:00
|
|
|
source $rootdir/scripts/common.sh
|
|
|
|
source $rootdir/test/common/autotest_common.sh
|
|
|
|
|
|
|
|
NVME_CMD="/usr/local/src/nvme-cli/nvme"
|
|
|
|
|
|
|
|
rpc_py=$rootdir/scripts/rpc.py
|
|
|
|
|
|
|
|
$rootdir/scripts/setup.sh
|
|
|
|
sleep 1
|
|
|
|
|
|
|
|
bdfs=$(get_nvme_bdfs)
|
|
|
|
|
|
|
|
$rootdir/scripts/setup.sh reset
|
|
|
|
|
2021-11-25 01:40:59 +00:00
|
|
|
# Find bdf that supports Namespace Management
|
2020-03-04 13:28:36 +00:00
|
|
|
for bdf in $bdfs; do
|
2020-06-08 14:48:03 +00:00
|
|
|
nvme_name=$(get_nvme_ctrlr_from_bdf ${bdf})
|
|
|
|
if [[ -z "$nvme_name" ]]; then
|
2020-03-04 13:28:36 +00:00
|
|
|
continue
|
|
|
|
fi
|
|
|
|
|
2020-06-09 09:41:16 +00:00
|
|
|
# Check Optional Admin Command Support for Namespace Management
|
2020-03-04 13:28:36 +00:00
|
|
|
oacs=$($NVME_CMD id-ctrl /dev/${nvme_name} | grep oacs | cut -d: -f2)
|
|
|
|
oacs_ns_manage=$((oacs & 0x8))
|
|
|
|
|
2020-04-17 12:30:16 +00:00
|
|
|
if [[ "$oacs_ns_manage" -ne 0 ]]; then
|
2020-03-04 13:28:36 +00:00
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
2020-04-17 12:30:16 +00:00
|
|
|
if [[ "${nvme_name}" == "" ]] || [[ "$oacs_ns_manage" -eq 0 ]]; then
|
2021-11-25 01:40:59 +00:00
|
|
|
echo "No NVMe device supporting Namespace management found"
|
2020-03-04 13:28:36 +00:00
|
|
|
$rootdir/scripts/setup.sh
|
2020-06-08 15:16:41 +00:00
|
|
|
exit 1
|
2020-03-04 13:28:36 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
nvme_dev=/dev/${nvme_name}
|
|
|
|
|
|
|
|
# Detect supported features and configuration
|
2020-04-17 12:30:16 +00:00
|
|
|
oaes=$($NVME_CMD id-ctrl ${nvme_dev} | grep oaes | cut -d: -f2)
|
|
|
|
aer_ns_change=$((oaes & 0x100))
|
|
|
|
|
2020-06-09 09:48:37 +00:00
|
|
|
function reset_nvme_if_aer_unsupported() {
|
|
|
|
if [[ "$aer_ns_change" -eq "0" ]]; then
|
|
|
|
sleep 1
|
|
|
|
$NVME_CMD reset "$1" || true
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2020-03-04 13:28:36 +00:00
|
|
|
function clean_up() {
|
|
|
|
$rootdir/scripts/setup.sh reset
|
|
|
|
|
2020-06-09 09:41:16 +00:00
|
|
|
# This assumes every NVMe controller contains single namespace,
|
2020-06-23 06:37:57 +00:00
|
|
|
# encompassing Total NVM Capacity and formatted as 512 block size.
|
|
|
|
# 512 block size is needed for test/vhost/vhost_boot.sh to
|
2021-11-25 01:40:59 +00:00
|
|
|
# successfully run.
|
2020-06-09 09:41:16 +00:00
|
|
|
|
|
|
|
tnvmcap=$($NVME_CMD id-ctrl ${nvme_dev} | grep tnvmcap | cut -d: -f2)
|
2020-06-23 06:37:57 +00:00
|
|
|
blksize=512
|
2020-06-09 09:41:16 +00:00
|
|
|
|
|
|
|
size=$((tnvmcap / blksize))
|
2020-03-04 13:28:36 +00:00
|
|
|
|
|
|
|
echo "Restoring $nvme_dev..."
|
|
|
|
$NVME_CMD detach-ns ${nvme_dev} -n 0xffffffff -c 0 || true
|
|
|
|
$NVME_CMD delete-ns ${nvme_dev} -n 0xffffffff || true
|
2020-06-09 09:41:16 +00:00
|
|
|
$NVME_CMD create-ns ${nvme_dev} -s ${size} -c ${size} -b ${blksize}
|
2020-03-04 13:28:36 +00:00
|
|
|
$NVME_CMD attach-ns ${nvme_dev} -n 1 -c 0
|
|
|
|
$NVME_CMD reset ${nvme_dev}
|
|
|
|
|
|
|
|
$rootdir/scripts/setup.sh
|
|
|
|
}
|
|
|
|
|
|
|
|
function info_print() {
|
|
|
|
echo "---"
|
|
|
|
echo "$@"
|
|
|
|
echo "---"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Prepare controller
|
|
|
|
info_print "delete all namespaces"
|
|
|
|
$NVME_CMD detach-ns ${nvme_dev} -n 0xffffffff -c 0 || true
|
|
|
|
$NVME_CMD delete-ns ${nvme_dev} -n 0xffffffff || true
|
|
|
|
|
2020-06-09 09:48:37 +00:00
|
|
|
reset_nvme_if_aer_unsupported ${nvme_dev}
|
2020-03-04 13:28:36 +00:00
|
|
|
sleep 1
|
|
|
|
|
2020-11-25 20:31:42 +00:00
|
|
|
PCI_ALLOWED="${bdf}" $rootdir/scripts/setup.sh
|
2020-03-04 13:28:36 +00:00
|
|
|
|
2020-05-11 21:15:03 +00:00
|
|
|
$SPDK_BIN_DIR/spdk_tgt -m 0x3 &
|
2020-03-04 13:28:36 +00:00
|
|
|
spdk_tgt_pid=$!
|
|
|
|
trap 'kill -9 ${spdk_tgt_pid}; clean_up; exit 1' SIGINT SIGTERM EXIT
|
|
|
|
|
|
|
|
waitforlisten $spdk_tgt_pid
|
|
|
|
|
|
|
|
$rpc_py bdev_nvme_attach_controller -b Nvme0 -t PCIe -a ${bdf}
|
|
|
|
$rpc_py bdev_nvme_cuse_register -n Nvme0
|
|
|
|
|
|
|
|
sleep 1
|
|
|
|
[[ -c /dev/spdk/nvme0 ]]
|
|
|
|
|
|
|
|
for dev in /dev/spdk/nvme0n*; do
|
|
|
|
[[ ! -c ${dev} ]]
|
|
|
|
done
|
|
|
|
|
|
|
|
info_print "create ns: nsze=10000 ncap=10000 flbias=0"
|
|
|
|
$NVME_CMD create-ns /dev/spdk/nvme0 -s 10000 -c 10000 -f 0
|
|
|
|
|
|
|
|
info_print "attach ns: nsid=1 controller=0"
|
|
|
|
$NVME_CMD attach-ns /dev/spdk/nvme0 -n 1 -c 0
|
|
|
|
|
2020-06-09 09:48:37 +00:00
|
|
|
reset_nvme_if_aer_unsupported /dev/spdk/nvme0
|
2020-03-04 13:28:36 +00:00
|
|
|
sleep 1
|
|
|
|
|
|
|
|
[[ -c /dev/spdk/nvme0n1 ]]
|
|
|
|
|
|
|
|
info_print "create ns: nsze=10000 ncap=10000 flbias=0"
|
|
|
|
$NVME_CMD create-ns /dev/spdk/nvme0 -s 10000 -c 10000 -f 0
|
|
|
|
|
|
|
|
info_print "attach ns: nsid=2 controller=0"
|
|
|
|
$NVME_CMD attach-ns /dev/spdk/nvme0 -n 2 -c 0
|
|
|
|
|
2020-06-09 09:48:37 +00:00
|
|
|
reset_nvme_if_aer_unsupported /dev/spdk/nvme0
|
2020-03-04 13:28:36 +00:00
|
|
|
sleep 1
|
|
|
|
|
|
|
|
[[ -c /dev/spdk/nvme0n2 ]]
|
|
|
|
|
|
|
|
info_print "detach ns: nsid=2 controller=0"
|
|
|
|
$NVME_CMD detach-ns /dev/spdk/nvme0 -n 2 -c 0 || true
|
|
|
|
|
|
|
|
info_print "delete ns: nsid=2"
|
|
|
|
$NVME_CMD delete-ns /dev/spdk/nvme0 -n 2 || true
|
|
|
|
|
2020-06-09 09:48:37 +00:00
|
|
|
reset_nvme_if_aer_unsupported /dev/spdk/nvme0
|
2020-03-04 13:28:36 +00:00
|
|
|
sleep 1
|
|
|
|
|
|
|
|
[[ ! -c /dev/spdk/nvme0n2 ]]
|
|
|
|
|
|
|
|
info_print "detach ns: nsid=1 controller=0"
|
|
|
|
$NVME_CMD detach-ns /dev/spdk/nvme0 -n 1 -c 0 || true
|
|
|
|
|
|
|
|
info_print "delete ns: nsid=1"
|
|
|
|
$NVME_CMD delete-ns /dev/spdk/nvme0 -n 1 || true
|
|
|
|
|
2020-06-09 09:48:37 +00:00
|
|
|
reset_nvme_if_aer_unsupported /dev/spdk/nvme0
|
2020-03-04 13:28:36 +00:00
|
|
|
sleep 1
|
|
|
|
|
|
|
|
# Here we should not have any cuse devices
|
|
|
|
for dev in /dev/spdk/nvme0n*; do
|
|
|
|
[[ ! -c ${dev} ]]
|
|
|
|
done
|
|
|
|
|
|
|
|
$rpc_py bdev_nvme_detach_controller Nvme0
|
|
|
|
|
|
|
|
sleep 1
|
|
|
|
[[ ! -c /dev/spdk/nvme0 ]]
|
|
|
|
|
|
|
|
trap - SIGINT SIGTERM EXIT
|
|
|
|
killprocess $spdk_tgt_pid
|
|
|
|
clean_up
|