1#!/usr/bin/env bash 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright (C) 2020 Intel Corporation 4# All rights reserved. 5# 6testdir=$(readlink -f $(dirname $0)) 7rootdir=$(readlink -f $testdir/../../..) 8source "$testdir/common.sh" 9 10$rootdir/scripts/setup.sh reset 11scan_nvme_ctrls 12 13# Find bdf that supports Namespace Management 14if ! nvme_name=$(get_nvme_with_ns_management); then 15 echo "No NVMe device supporting Namespace management found" 16 $rootdir/scripts/setup.sh 17 exit 1 18fi 19 20nvme_dev=/dev/${nvme_name} 21bdf=${bdfs["$nvme_name"]} 22nsids=($(get_nvme_nss "$nvme_name")) 23 24# Detect supported features and configuration 25oaes=$(get_nvme_ctrl_feature "$nvme_name" oaes) 26aer_ns_change=$((oaes & 0x100)) 27cntlid=$(get_nvme_ctrl_feature "$nvme_name") 28 29function reset_nvme_if_aer_unsupported() { 30 if [[ "$aer_ns_change" -eq "0" ]]; then 31 sleep 1 32 $NVME_CMD reset "$1" || true 33 fi 34} 35 36function remove_all_namespaces() { 37 info_print "delete all namespaces" 38 # Can't globally detach all namespaces ... must do so one by one 39 for nsid in "${nsids[@]}"; do 40 info_print "removing nsid=${nsid}" 41 $NVME_CMD detach-ns ${nvme_dev} -n ${nsid} -c ${cntlid} || true 42 $NVME_CMD delete-ns ${nvme_dev} -n ${nsid} || true 43 done 44} 45 46function clean_up() { 47 "$rootdir/scripts/setup.sh" reset 48 remove_all_namespaces 49 50 echo "Restoring $nvme_dev..." 51 for nsid in "${nsids[@]}"; do 52 ncap=$(get_nvme_ns_feature "$nvme_name" "$nsid" ncap) 53 nsze=$(get_nvme_ns_feature "$nvme_name" "$nsid" nsze) 54 lbaf=$(get_active_lbaf "$nvme_name" "$nsid") 55 $NVME_CMD create-ns ${nvme_dev} -s ${nsze} -c ${ncap} -f ${lbaf} 56 $NVME_CMD attach-ns ${nvme_dev} -n ${nsid} -c ${cntlid} 57 $NVME_CMD reset ${nvme_dev} 58 done 59 60 $rootdir/scripts/setup.sh 61} 62 63function info_print() { 64 echo "---" 65 echo "$@" 66 echo "---" 67} 68 69# Prepare controller 70remove_all_namespaces 71 72reset_nvme_if_aer_unsupported ${nvme_dev} 73sleep 1 74 75PCI_ALLOWED="${bdf}" $rootdir/scripts/setup.sh 76 77$SPDK_BIN_DIR/spdk_tgt -m 0x3 & 78spdk_tgt_pid=$! 79trap 'kill -9 ${spdk_tgt_pid}; clean_up; exit 1' SIGINT SIGTERM EXIT 80 81waitforlisten $spdk_tgt_pid 82 83$rpc_py bdev_nvme_attach_controller -b Nvme0 -t PCIe -a ${bdf} 84$rpc_py bdev_nvme_cuse_register -n Nvme0 85 86ctrlr="/dev/spdk/nvme0" 87 88sleep 1 89[[ -c $ctrlr ]] 90 91for dev in "${ctrlr}"n*; do 92 [[ ! -c ${dev} ]] 93done 94sleep 1 95 96for nsid in "${nsids[@]}"; do 97 info_print "create ns: nsze=10000 ncap=10000 flbias=0" 98 $NVME_CMD create-ns ${ctrlr} -s 10000 -c 10000 -f 0 99 info_print "attach ns: nsid=${nsid} controller=${cntlid}" 100 $NVME_CMD attach-ns ${ctrlr} -n ${nsid} -c ${cntlid} 101 reset_nvme_if_aer_unsupported ${ctrlr} 102 sleep 1 103 [[ -c "${ctrlr}n${nsid}" ]] 104 info_print "detach ns: nsid=${nsid} controller=${cntlid}" 105 $NVME_CMD detach-ns ${ctrlr} -n ${nsid} -c ${cntlid} 106 info_print "delete ns: nsid=${nsid}" 107 $NVME_CMD delete-ns ${ctrlr} -n ${nsid} 108 reset_nvme_if_aer_unsupported ${ctrlr} 109 sleep 1 110 [[ ! -c "${ctrlr}n${nsid}" ]] 111done 112 113# Here we should not have any cuse devices 114for dev in "${ctrlr}"n*; do 115 [[ ! -c ${dev} ]] 116done 117 118$rpc_py bdev_nvme_detach_controller Nvme0 119 120sleep 1 121[[ ! -c ${ctrlr} ]] 122 123trap - SIGINT SIGTERM EXIT 124killprocess $spdk_tgt_pid 125clean_up 126