xref: /spdk/test/common/autotest_common.sh (revision 9ba80de0dd1ff42ae70fc9fea9d33f67be78d7ea)
13b660ea8SDarek Stojaczykfunction xtrace_disable() {
2190b2245SSeth Howell	if [ "$XTRACE_DISABLED" != "yes" ]; then
33b660ea8SDarek Stojaczyk		PREV_BASH_OPTS="$-"
4190b2245SSeth Howell		if [[ "$PREV_BASH_OPTS" == *"x"* ]]; then
5190b2245SSeth Howell			XTRACE_DISABLED="yes"
6190b2245SSeth Howell		fi
73b660ea8SDarek Stojaczyk		set +x
818b9303dSMichal Berger		shopt -u extdebug
939fe5c84SSeth Howell        elif [ -z $XTRACE_NESTING_LEVEL ]; then
1039fe5c84SSeth Howell                XTRACE_NESTING_LEVEL=1
1139fe5c84SSeth Howell        else
1239fe5c84SSeth Howell                XTRACE_NESTING_LEVEL=$((++XTRACE_NESTING_LEVEL))
13190b2245SSeth Howell	fi
143b660ea8SDarek Stojaczyk}
153b660ea8SDarek Stojaczyk
16fadcb08dSDarek Stojaczykxtrace_disable
17fadcb08dSDarek Stojaczykset -e
18fadcb08dSDarek Stojaczykshopt -s expand_aliases
19fadcb08dSDarek Stojaczyk
208d2247e2SDarek Stojaczyk# Dummy function to be called after restoring xtrace just so that it appears in the
218d2247e2SDarek Stojaczyk# xtrace log. This way we can consistently track when xtrace is enabled/disabled.
228d2247e2SDarek Stojaczykfunction xtrace_enable() {
238d2247e2SDarek Stojaczyk	# We have to do something inside a function in bash, and calling any command
248d2247e2SDarek Stojaczyk	# (even `:`) will produce an xtrace entry, so we just define another function.
258d2247e2SDarek Stojaczyk	function xtrace_dummy() { :; }
268d2247e2SDarek Stojaczyk}
278d2247e2SDarek Stojaczyk
28fadcb08dSDarek Stojaczyk# Keep it as alias to avoid xtrace_enable backtrace always pointing to xtrace_restore.
29fadcb08dSDarek Stojaczyk# xtrace_enable will appear as called directly from the user script, from the same line
30fadcb08dSDarek Stojaczyk# that "called" xtrace_restore.
3139fe5c84SSeth Howellalias xtrace_restore=\
3239fe5c84SSeth Howell'if [ -z $XTRACE_NESTING_LEVEL ]; then
3339fe5c84SSeth Howell        if [[ "$PREV_BASH_OPTS" == *"x"* ]]; then
3418b9303dSMichal Berger		XTRACE_DISABLED="no"; PREV_BASH_OPTS=""; shopt -s extdebug; set -x; xtrace_enable;
3539fe5c84SSeth Howell	fi
3639fe5c84SSeth Howellelse
3739fe5c84SSeth Howell	XTRACE_NESTING_LEVEL=$((--XTRACE_NESTING_LEVEL));
3839fe5c84SSeth Howell	if [ $XTRACE_NESTING_LEVEL -eq "0" ]; then
3939fe5c84SSeth Howell		unset XTRACE_NESTING_LEVEL
4039fe5c84SSeth Howell	fi
4139fe5c84SSeth Howellfi'
42c9e5d2a6SSeth Howell
43c9e5d2a6SSeth Howell: ${RUN_NIGHTLY:=0}
44c9e5d2a6SSeth Howellexport RUN_NIGHTLY
45c9e5d2a6SSeth Howell
46b96cf2efSPawel Niedzwiecki: ${RUN_NIGHTLY_FAILING:=0}
47b96cf2efSPawel Niedzwieckiexport RUN_NIGHTLY_FAILING
48b96cf2efSPawel Niedzwiecki
49c9e5d2a6SSeth Howell# Set defaults for missing test config options
500560976dSPawel Niedzwiecki: ${SPDK_BUILD_DOC=0}; export SPDK_BUILD_DOC
519a25fc12STomasz Zawadzki: ${SPDK_BUILD_PACKAGE=0}; export SPDK_BUILD_PACKAGE
520560976dSPawel Niedzwiecki: ${SPDK_BUILD_SHARED_OBJECT=0}; export SPDK_BUILD_SHARED_OBJECT
530560976dSPawel Niedzwiecki: ${SPDK_RUN_VALGRIND=0}; export SPDK_RUN_VALGRIND
540560976dSPawel Niedzwiecki: ${SPDK_RUN_FUNCTIONAL_TEST=0}; export SPDK_RUN_FUNCTIONAL_TEST
550560976dSPawel Niedzwiecki: ${SPDK_TEST_UNITTEST=0}; export SPDK_TEST_UNITTEST
562f476a63SSeth Howell: ${SPDK_TEST_AUTOBUILD=0}; export SPDK_TEST_AUTOBUILD
570560976dSPawel Niedzwiecki: ${SPDK_TEST_ISAL=0}; export SPDK_TEST_ISAL
580560976dSPawel Niedzwiecki: ${SPDK_TEST_ISCSI=0}; export SPDK_TEST_ISCSI
590560976dSPawel Niedzwiecki: ${SPDK_TEST_ISCSI_INITIATOR=0}; export SPDK_TEST_ISCSI_INITIATOR
600560976dSPawel Niedzwiecki: ${SPDK_TEST_NVME=0}; export SPDK_TEST_NVME
610560976dSPawel Niedzwiecki: ${SPDK_TEST_NVME_CLI=0}; export SPDK_TEST_NVME_CLI
62efbcd259STomasz Kulasek: ${SPDK_TEST_NVME_CUSE=0}; export SPDK_TEST_NVME_CUSE
630560976dSPawel Niedzwiecki: ${SPDK_TEST_NVMF=0}; export SPDK_TEST_NVMF
64d19b101cSSeth Howell: ${SPDK_TEST_NVMF_TRANSPORT="rdma"}; export SPDK_TEST_NVMF_TRANSPORT
650560976dSPawel Niedzwiecki: ${SPDK_TEST_RBD=0}; export SPDK_TEST_RBD
660560976dSPawel Niedzwiecki: ${SPDK_TEST_VHOST=0}; export SPDK_TEST_VHOST
670560976dSPawel Niedzwiecki: ${SPDK_TEST_BLOCKDEV=0}; export SPDK_TEST_BLOCKDEV
680560976dSPawel Niedzwiecki: ${SPDK_TEST_IOAT=0}; export SPDK_TEST_IOAT
690560976dSPawel Niedzwiecki: ${SPDK_TEST_EVENT=0}; export SPDK_TEST_EVENT
700560976dSPawel Niedzwiecki: ${SPDK_TEST_BLOBFS=0}; export SPDK_TEST_BLOBFS
710560976dSPawel Niedzwiecki: ${SPDK_TEST_VHOST_INIT=0}; export SPDK_TEST_VHOST_INIT
720560976dSPawel Niedzwiecki: ${SPDK_TEST_PMDK=0}; export SPDK_TEST_PMDK
730560976dSPawel Niedzwiecki: ${SPDK_TEST_LVOL=0}; export SPDK_TEST_LVOL
740560976dSPawel Niedzwiecki: ${SPDK_TEST_JSON=0}; export SPDK_TEST_JSON
750560976dSPawel Niedzwiecki: ${SPDK_TEST_REDUCE=0}; export SPDK_TEST_REDUCE
7614a62d67STomasz Kulasek: ${SPDK_TEST_VPP=0}; export SPDK_TEST_VPP
770560976dSPawel Niedzwiecki: ${SPDK_RUN_ASAN=0}; export SPDK_RUN_ASAN
780560976dSPawel Niedzwiecki: ${SPDK_RUN_UBSAN=0}; export SPDK_RUN_UBSAN
790560976dSPawel Niedzwiecki: ${SPDK_RUN_INSTALLED_DPDK=0}; export SPDK_RUN_INSTALLED_DPDK
80714a5646SBen Walker: ${SPDK_RUN_NON_ROOT=0}; export SPDK_RUN_NON_ROOT
810560976dSPawel Niedzwiecki: ${SPDK_TEST_CRYPTO=0}; export SPDK_TEST_CRYPTO
82ef2e614cSWojciech Malikowski: ${SPDK_TEST_FTL=0}; export SPDK_TEST_FTL
830560976dSPawel Niedzwiecki: ${SPDK_TEST_OCF=0}; export SPDK_TEST_OCF
840699216fSWojciech Malikowski: ${SPDK_TEST_FTL_EXTENDED=0}; export SPDK_TEST_FTL_EXTENDED
851d717c7cSWojciech Malikowski: ${SPDK_TEST_VMD=0}; export SPDK_TEST_VMD
862176f081SChunyang Hui: ${SPDK_TEST_OPAL=0}; export SPDK_TEST_OPAL
877612ac47SDarek Stojaczyk: ${SPDK_AUTOTEST_X=true}; export SPDK_AUTOTEST_X
88c9e5d2a6SSeth Howell
8905dde5c2STomasz Zawadzki# Export PYTHONPATH with addition of RPC framework. New scripts can be created
9005dde5c2STomasz Zawadzki# specific use cases for tests.
9105dde5c2STomasz Zawadzkiexport PYTHONPATH=$PYTHONPATH:$rootdir/scripts
9205dde5c2STomasz Zawadzki
93f657669eSKarol Latecki# Don't create Python .pyc files. When running with sudo these will be
94f657669eSKarol Latecki# created with root ownership and can cause problems when cleaning the repository.
95f657669eSKarol Lateckiexport PYTHONDONTWRITEBYTECODE=1
96f657669eSKarol Latecki
97f40d2451SSeth Howell# Export flag to skip the known bug that exists in librados
98f40d2451SSeth Howell# Bug is reported on ceph bug tracker with number 24078
99f40d2451SSeth Howellexport ASAN_OPTIONS=new_delete_type_mismatch=0
100f40d2451SSeth Howellexport UBSAN_OPTIONS='halt_on_error=1:print_stacktrace=1:abort_on_error=1'
101f40d2451SSeth Howell
1029fda9814STomasz Zawadzki# Export LeakSanitizer option to use suppression file in order to prevent false positives
1039fda9814STomasz Zawadzki# and known leaks in external executables or libraries from showing up.
1049fda9814STomasz Zawadzkiasan_suppression_file="/var/tmp/asan_suppression_file"
1059fda9814STomasz Zawadzkisudo rm -rf "$asan_suppression_file"
10602925187SMaciej Wawrykcat << EOL >> "$asan_suppression_file"
1079fda9814STomasz Zawadzki# ASAN has some bugs around thread_local variables.  We have a destructor in place
1089fda9814STomasz Zawadzki# to free the thread contexts, but ASAN complains about the leak before those
1099fda9814STomasz Zawadzki# destructors have a chance to run.  So suppress this one specific leak using
1109fda9814STomasz Zawadzki# LSAN_OPTIONS.
11102925187SMaciej Wawrykleak:spdk_fs_alloc_thread_ctx
1129fda9814STomasz Zawadzki
1131bed9c1fSTomasz Zawadzki# Suppress known leaks in fio project
11402925187SMaciej Wawrykleak:/usr/src/fio/parse.c
11502925187SMaciej Wawrykleak:/usr/src/fio/iolog.c
11602925187SMaciej Wawrykleak:/usr/src/fio/init.c
11702925187SMaciej Wawrykleak:fio_memalign
11802925187SMaciej Wawrykleak:spdk_fio_io_u_init
1191bed9c1fSTomasz Zawadzki
1201891f2e5STomasz Zawadzki# Suppress leaks in libiscsi
12102925187SMaciej Wawrykleak:libiscsi.so
12202925187SMaciej WawrykEOL
1231891f2e5STomasz Zawadzki
1248e70c6e3STomasz Kulasek# Suppress leaks in libfuse3
1258e70c6e3STomasz Kulasekecho "leak:libfuse3.so" >> "$asan_suppression_file"
1268e70c6e3STomasz Kulasek
1279fda9814STomasz Zawadzkiexport LSAN_OPTIONS=suppressions="$asan_suppression_file"
1289fda9814STomasz Zawadzki
129f40d2451SSeth Howellexport DEFAULT_RPC_ADDR="/var/tmp/spdk.sock"
130f40d2451SSeth Howell
131f04277f0SJohn Meneghiniif [ -z "$DEPENDENCY_DIR" ]; then
132f04277f0SJohn Meneghini	export DEPENDENCY_DIR=/home/sys_sgsw
133f04277f0SJohn Meneghinielse
134f04277f0SJohn Meneghini	export DEPENDENCY_DIR
135f04277f0SJohn Meneghinifi
136f04277f0SJohn Meneghini
137c9e5d2a6SSeth Howell# pass our valgrind desire on to unittest.sh
138c9e5d2a6SSeth Howellif [ $SPDK_RUN_VALGRIND -eq 0 ]; then
139c9e5d2a6SSeth Howell	export valgrind=''
140c9e5d2a6SSeth Howellfi
141c9e5d2a6SSeth Howell
142f40d2451SSeth Howellif [ "$(uname -s)" = "Linux" ]; then
14338d4a2a2SPawel Kaminski	MAKE="make"
144f40d2451SSeth Howell	MAKEFLAGS=${MAKEFLAGS:--j$(nproc)}
145f40d2451SSeth Howell	DPDK_LINUX_DIR=/usr/share/dpdk/x86_64-default-linuxapp-gcc
146f40d2451SSeth Howell	if [ -d $DPDK_LINUX_DIR ] && [ $SPDK_RUN_INSTALLED_DPDK -eq 1 ]; then
147f40d2451SSeth Howell		WITH_DPDK_DIR=$DPDK_LINUX_DIR
148f40d2451SSeth Howell	fi
149f40d2451SSeth Howell	# Override the default HUGEMEM in scripts/setup.sh to allocate 8GB in hugepages.
150f40d2451SSeth Howell	export HUGEMEM=8192
151f40d2451SSeth Howellelif [ "$(uname -s)" = "FreeBSD" ]; then
15238d4a2a2SPawel Kaminski	MAKE="gmake"
153772eb8ebSKarol Latecki	MAKEFLAGS=${MAKEFLAGS:--j$(sysctl -a | grep -E -i 'hw.ncpu' | awk '{print $2}')}
154f40d2451SSeth Howell	DPDK_FREEBSD_DIR=/usr/local/share/dpdk/x86_64-native-bsdapp-clang
155f40d2451SSeth Howell	if [ -d $DPDK_FREEBSD_DIR ] && [ $SPDK_RUN_INSTALLED_DPDK -eq 1 ]; then
156f40d2451SSeth Howell		WITH_DPDK_DIR=$DPDK_FREEBSD_DIR
157f40d2451SSeth Howell	fi
158f40d2451SSeth Howell	# FreeBSD runs a much more limited set of tests, so keep the default 2GB.
159f40d2451SSeth Howell	export HUGEMEM=2048
160f40d2451SSeth Howellelse
161f40d2451SSeth Howell	echo "Unknown OS \"$(uname -s)\""
162f40d2451SSeth Howell	exit 1
163f40d2451SSeth Howellfi
164f40d2451SSeth Howell
165c9e5d2a6SSeth Howellconfig_params='--enable-debug --enable-werror'
166c9e5d2a6SSeth Howell
167848daf27SPawel Wodkowskiif echo -e "#include <libunwind.h>\nint main(int argc, char *argv[]) {return 0;}\n" | \
168848daf27SPawel Wodkowski	gcc -o /dev/null -lunwind -x c - 2>/dev/null; then
169ae2b2f64SPawel Wodkowski	config_params+=' --enable-log-bt'
170848daf27SPawel Wodkowskifi
171848daf27SPawel Wodkowski
1728a43cd27Spaul luse# for options with dependencies but no test flag, set them here
1738a43cd27Spaul luseif [ -f /usr/include/infiniband/verbs.h ]; then
1748a43cd27Spaul luse	config_params+=' --with-rdma'
1758a43cd27Spaul lusefi
1768a43cd27Spaul luse
1778a43cd27Spaul luseif [ -d /usr/src/fio ]; then
1788a43cd27Spaul luse	config_params+=' --with-fio=/usr/src/fio'
1798a43cd27Spaul lusefi
1808a43cd27Spaul luse
1818a43cd27Spaul luseif [ -d ${DEPENDENCY_DIR}/vtune_codes ]; then
1828a43cd27Spaul luse	config_params+=' --with-vtune='${DEPENDENCY_DIR}'/vtune_codes'
1838a43cd27Spaul lusefi
1848a43cd27Spaul luse
1858a43cd27Spaul luseif [ -d /usr/include/iscsi ]; then
186fb9c4ee6SKarol Latecki	libiscsi_version=$(grep LIBISCSI_API_VERSION /usr/include/iscsi/iscsi.h | head -1 | awk '{print $3}' | awk -F '(' '{print $2}' | awk -F ')' '{print $1}')
1878a43cd27Spaul luse	if [ $libiscsi_version -ge 20150621 ]; then
1888a43cd27Spaul luse		config_params+=' --with-iscsi-initiator'
1898a43cd27Spaul luse	fi
1908a43cd27Spaul lusefi
1918a43cd27Spaul luse
192efbcd259STomasz Kulasekif [ $SPDK_TEST_NVME_CUSE -eq 1 ]; then
193efbcd259STomasz Kulasek	config_params+=' --with-nvme-cuse'
194efbcd259STomasz Kulasekfi
195efbcd259STomasz Kulasek
1968a43cd27Spaul luse# for options with both dependencies and a test flag, set them here
1978a43cd27Spaul luseif [ -f /usr/include/libpmemblk.h ] && [ $SPDK_TEST_PMDK -eq 1 ]; then
1988a43cd27Spaul luse	config_params+=' --with-pmdk'
1998a43cd27Spaul lusefi
2008a43cd27Spaul luse
2018a43cd27Spaul luseif [ -f /usr/include/libpmem.h ] && [ $SPDK_TEST_REDUCE -eq 1 ]; then
2028a43cd27Spaul luse	if [ $SPDK_TEST_ISAL -eq 1 ]; then
2038a43cd27Spaul luse		config_params+=' --with-reduce'
2048a43cd27Spaul luse	else
2058a43cd27Spaul luse		echo "reduce not enabled because isal is not enabled."
2068a43cd27Spaul luse	fi
2078a43cd27Spaul lusefi
2088a43cd27Spaul luse
2098a43cd27Spaul luseif [ -d /usr/include/rbd ] &&  [ -d /usr/include/rados ] && [ $SPDK_TEST_RBD -eq 1 ]; then
2108a43cd27Spaul luse	config_params+=' --with-rbd'
2118a43cd27Spaul lusefi
2128a43cd27Spaul luse
21314a62d67STomasz Kulasekif [ $SPDK_TEST_VPP -eq 1 ]; then
2149307ff5aSTomasz Kulasek	VPP_PATH="/usr/local/src/vpp-19.04/build-root/install-vpp_debug-native/vpp/"
21514a62d67STomasz Kulasek	export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${VPP_PATH}/lib/
21614a62d67STomasz Kulasek	export PATH=${PATH}:${VPP_PATH}/bin/
21714a62d67STomasz Kulasek	config_params+=" --with-vpp=${VPP_PATH}"
21814a62d67STomasz Kulasekfi
21914a62d67STomasz Kulasek
2208a43cd27Spaul luse# for options with no required dependencies, just test flags, set them here
22151606ed4SPaul Luseif [ $SPDK_TEST_CRYPTO -eq 1 ]; then
22251606ed4SPaul Luse	config_params+=' --with-crypto'
22351606ed4SPaul Lusefi
22451606ed4SPaul Luse
2252fde729fSVitaliy Mysakif [ $SPDK_TEST_OCF -eq 1 ]; then
22634bdceabSVitaliy Mysak	config_params+=" --with-ocf"
2272fde729fSVitaliy Mysakfi
2282fde729fSVitaliy Mysak
229e20401c8SDarek Stojaczykif [ $SPDK_RUN_UBSAN -eq 1 ]; then
230e20401c8SDarek Stojaczyk	config_params+=' --enable-ubsan'
231e20401c8SDarek Stojaczykfi
232e20401c8SDarek Stojaczyk
233e20401c8SDarek Stojaczykif [ $SPDK_RUN_ASAN -eq 1 ]; then
234e20401c8SDarek Stojaczyk	config_params+=' --enable-asan'
235e20401c8SDarek Stojaczykfi
236e20401c8SDarek Stojaczyk
23785e70f4eSDarek Stojaczykif [ "$(uname -s)" = "Linux" ]; then
238c9e5d2a6SSeth Howell	config_params+=' --enable-coverage'
23985e70f4eSDarek Stojaczykfi
240c9e5d2a6SSeth Howell
2418a43cd27Spaul luseif [ $SPDK_TEST_ISAL -eq 0 ]; then
2428a43cd27Spaul luse	config_params+=' --without-isal'
2438a43cd27Spaul lusefi
2448a43cd27Spaul luse
2457fa15e28SXiaodong Liuif [ $SPDK_TEST_BLOBFS -eq 1 ]; then
2467fa15e28SXiaodong Liu	if [[ -d /usr/include/fuse3 ]] && [[ -d /usr/local/include/fuse3 ]]; then
2477fa15e28SXiaodong Liu		config_params+=' --with-fuse'
2487fa15e28SXiaodong Liu	else
2497fa15e28SXiaodong Liu		echo "FUSE not enabled because libfuse3 is not installed."
2507fa15e28SXiaodong Liu	fi
2517fa15e28SXiaodong Liufi
2527fa15e28SXiaodong Liu
253c9e5d2a6SSeth Howell# By default, --with-dpdk is not set meaning the SPDK build will use the DPDK submodule.
254c9e5d2a6SSeth Howell# If a DPDK installation is found in a well-known location though, WITH_DPDK_DIR will be
255c9e5d2a6SSeth Howell# set which will override the default and use that DPDK installation instead.
2561ccc878eSKarol Lateckiif [ -n "$WITH_DPDK_DIR" ]; then
257c9e5d2a6SSeth Howell	config_params+=" --with-dpdk=$WITH_DPDK_DIR"
258c9e5d2a6SSeth Howellfi
259c9e5d2a6SSeth Howell
260c9e5d2a6SSeth Howellexport config_params
261c9e5d2a6SSeth Howell
262c9e5d2a6SSeth Howellif [ -z "$output_dir" ]; then
263c9e5d2a6SSeth Howell	if [ -z "$rootdir" ] || [ ! -d "$rootdir/../output" ]; then
264c9e5d2a6SSeth Howell		output_dir=.
265c9e5d2a6SSeth Howell	else
266c9e5d2a6SSeth Howell		output_dir=$rootdir/../output
267c9e5d2a6SSeth Howell	fi
268c9e5d2a6SSeth Howell	export output_dir
269c9e5d2a6SSeth Howellfi
270c9e5d2a6SSeth Howell
2716a8a1b6bSJim HarrisTEST_MODE=
2726a8a1b6bSJim Harrisfor i in "$@"; do
2736a8a1b6bSJim Harris	case "$i" in
2746a8a1b6bSJim Harris		--iso)
2756a8a1b6bSJim Harris			TEST_MODE=iso
2766a8a1b6bSJim Harris			;;
2776a8a1b6bSJim Harris		--transport=*)
2786a8a1b6bSJim Harris			TEST_TRANSPORT="${i#*=}"
2796a8a1b6bSJim Harris			;;
2806a8a1b6bSJim Harris		--sock=*)
2816a8a1b6bSJim Harris			TEST_SOCK="${i#*=}"
2826a8a1b6bSJim Harris			;;
2836a8a1b6bSJim Harris	esac
2846a8a1b6bSJim Harrisdone
2856a8a1b6bSJim Harris
286c9e5d2a6SSeth Howellfunction timing() {
287c9e5d2a6SSeth Howell	direction="$1"
288c9e5d2a6SSeth Howell	testname="$2"
289c9e5d2a6SSeth Howell
290c9e5d2a6SSeth Howell	now=$(date +%s)
291c9e5d2a6SSeth Howell
292c9e5d2a6SSeth Howell	if [ "$direction" = "enter" ]; then
293c9e5d2a6SSeth Howell		export timing_stack="${timing_stack};${now}"
294c9e5d2a6SSeth Howell		export test_stack="${test_stack};${testname}"
295c9e5d2a6SSeth Howell	else
2967c00bdabSDarek Stojaczyk		touch "$output_dir/timing.txt"
297c9e5d2a6SSeth Howell		child_time=$(grep "^${test_stack:1};" $output_dir/timing.txt | awk '{s+=$2} END {print s}')
298c9e5d2a6SSeth Howell
299c9e5d2a6SSeth Howell		start_time=$(echo "$timing_stack" | sed -e 's@^.*;@@')
300c9e5d2a6SSeth Howell		timing_stack=$(echo "$timing_stack" | sed -e 's@;[^;]*$@@')
301c9e5d2a6SSeth Howell
302c9e5d2a6SSeth Howell		elapsed=$((now - start_time - child_time))
303c9e5d2a6SSeth Howell		echo "${test_stack:1} $elapsed" >> $output_dir/timing.txt
304c9e5d2a6SSeth Howell
305c9e5d2a6SSeth Howell		test_stack=$(echo "$test_stack" | sed -e 's@;[^;]*$@@')
306c9e5d2a6SSeth Howell	fi
307c9e5d2a6SSeth Howell}
308c9e5d2a6SSeth Howell
309c9e5d2a6SSeth Howellfunction timing_enter() {
3103b660ea8SDarek Stojaczyk	xtrace_disable
311c9e5d2a6SSeth Howell	timing "enter" "$1"
3123b660ea8SDarek Stojaczyk	xtrace_restore
313c9e5d2a6SSeth Howell}
314c9e5d2a6SSeth Howell
315c9e5d2a6SSeth Howellfunction timing_exit() {
3163b660ea8SDarek Stojaczyk	xtrace_disable
317c9e5d2a6SSeth Howell	timing "exit" "$1"
3183b660ea8SDarek Stojaczyk	xtrace_restore
319c9e5d2a6SSeth Howell}
320c9e5d2a6SSeth Howell
321c9e5d2a6SSeth Howellfunction timing_finish() {
322c9e5d2a6SSeth Howell	flamegraph='/usr/local/FlameGraph/flamegraph.pl'
323c9e5d2a6SSeth Howell	if [ -x "$flamegraph" ]; then
324c9e5d2a6SSeth Howell		"$flamegraph" \
325c9e5d2a6SSeth Howell			--title 'Build Timing' \
326c9e5d2a6SSeth Howell			--nametype 'Step:' \
327c9e5d2a6SSeth Howell			--countname seconds \
328c9e5d2a6SSeth Howell			$output_dir/timing.txt \
329c9e5d2a6SSeth Howell			>$output_dir/timing.svg
330c9e5d2a6SSeth Howell	fi
331c9e5d2a6SSeth Howell}
332c9e5d2a6SSeth Howell
333a562812dSSeth Howellfunction create_test_list() {
334a571eb03SSeth Howell	grep -rshI --exclude="autotest_common.sh" \
335a571eb03SSeth Howell	--exclude="$rootdir/test/common/autotest_common.sh" \
336a571eb03SSeth Howell	-e "run_test " $rootdir | grep -v "#" \
337a571eb03SSeth Howell	| sed 's/^.*run_test/run_test/' | awk '{print $2}' | \
338a571eb03SSeth Howell	sed 's/\"//g' | sort > $output_dir/all_tests.txt || true
339a562812dSSeth Howell}
340a562812dSSeth Howell
341327668c8STomasz Kulasekfunction gdb_attach() {
342327668c8STomasz Kulasek	gdb -q --batch \
343327668c8STomasz Kulasek		-ex 'handle SIGHUP nostop pass' \
344327668c8STomasz Kulasek		-ex 'handle SIGQUIT nostop pass' \
345327668c8STomasz Kulasek		-ex 'handle SIGPIPE nostop pass' \
346327668c8STomasz Kulasek		-ex 'handle SIGALRM nostop pass' \
347327668c8STomasz Kulasek		-ex 'handle SIGTERM nostop pass' \
348327668c8STomasz Kulasek		-ex 'handle SIGUSR1 nostop pass' \
349327668c8STomasz Kulasek		-ex 'handle SIGUSR2 nostop pass' \
350327668c8STomasz Kulasek		-ex 'handle SIGCHLD nostop pass' \
351327668c8STomasz Kulasek		-ex 'set print thread-events off' \
352327668c8STomasz Kulasek		-ex 'cont' \
353327668c8STomasz Kulasek		-ex 'thread apply all bt' \
354327668c8STomasz Kulasek		-ex 'quit' \
355327668c8STomasz Kulasek		--tty=/dev/stdout \
356327668c8STomasz Kulasek		-p $1
357327668c8STomasz Kulasek}
358327668c8STomasz Kulasek
359c9e5d2a6SSeth Howellfunction process_core() {
360c9e5d2a6SSeth Howell	ret=0
361f1131f1dSMaciej Wawryk	while IFS= read -r -d '' core;
362f1131f1dSMaciej Wawryk	do
363c9e5d2a6SSeth Howell		exe=$(eu-readelf -n "$core" | grep psargs | sed "s/.*psargs: \([^ \'\" ]*\).*/\1/")
364b606baabSKarol Latecki		if [[ ! -f "$exe" ]]; then
365b606baabSKarol Latecki			exe=$(eu-readelf -n "$core" | grep -oP -m1 "$exe.+")
366b606baabSKarol Latecki		fi
367c9e5d2a6SSeth Howell		echo "exe for $core is $exe"
3681ccc878eSKarol Latecki		if [[ -n "$exe" ]]; then
369005e18a8SDarek Stojaczyk			if hash gdb &>/dev/null; then
370c9e5d2a6SSeth Howell				gdb -batch -ex "thread apply all bt full" $exe $core
371c9e5d2a6SSeth Howell			fi
372c9e5d2a6SSeth Howell			cp $exe $output_dir
373c9e5d2a6SSeth Howell		fi
374c9e5d2a6SSeth Howell		mv $core $output_dir
375c9e5d2a6SSeth Howell		chmod a+r $output_dir/$core
376c9e5d2a6SSeth Howell		ret=1
377f1131f1dSMaciej Wawryk	done < <(find . -type f \( -name 'core\.?[0-9]*' -o -name '*.core' \) -print0)
378c9e5d2a6SSeth Howell	return $ret
379c9e5d2a6SSeth Howell}
380c9e5d2a6SSeth Howell
381af32aa1bSKarol Lateckifunction process_shm() {
382af32aa1bSKarol Latecki	type=$1
383af32aa1bSKarol Latecki	id=$2
384af32aa1bSKarol Latecki	if [ "$type" = "--pid" ]; then
385af32aa1bSKarol Latecki		id="pid${id}"
386af32aa1bSKarol Latecki	elif [ "$type" = "--id" ]; then
387af32aa1bSKarol Latecki		id="${id}"
388af32aa1bSKarol Latecki	else
389af32aa1bSKarol Latecki		echo "Please specify to search for pid or shared memory id."
390af32aa1bSKarol Latecki		return 1
391af32aa1bSKarol Latecki	fi
392af32aa1bSKarol Latecki
393af32aa1bSKarol Latecki	shm_files=$(find /dev/shm -name "*.${id}" -printf "%f\n")
394af32aa1bSKarol Latecki
395af32aa1bSKarol Latecki	if [[ -z $shm_files ]]; then
396af32aa1bSKarol Latecki		echo "SHM File for specified PID or shared memory id: ${id} not found!"
397af32aa1bSKarol Latecki		return 1
398af32aa1bSKarol Latecki	fi
399af32aa1bSKarol Latecki	for n in $shm_files; do
400af32aa1bSKarol Latecki		tar -C /dev/shm/ -cvzf $output_dir/${n}_shm.tar.gz ${n}
401af32aa1bSKarol Latecki	done
402af32aa1bSKarol Latecki	return 0
403af32aa1bSKarol Latecki}
404af32aa1bSKarol Latecki
405c9e5d2a6SSeth Howellfunction waitforlisten() {
406c9e5d2a6SSeth Howell	# $1 = process pid
407c9e5d2a6SSeth Howell	if [ -z "$1" ]; then
408c9e5d2a6SSeth Howell		exit 1
409c9e5d2a6SSeth Howell	fi
410c9e5d2a6SSeth Howell
411f751ea17SPawel Wodkowski	local rpc_addr="${2:-$DEFAULT_RPC_ADDR}"
412c9e5d2a6SSeth Howell
413c9e5d2a6SSeth Howell	echo "Waiting for process to start up and listen on UNIX domain socket $rpc_addr..."
414c9e5d2a6SSeth Howell	# turn off trace for this loop
4153b660ea8SDarek Stojaczyk	xtrace_disable
416f751ea17SPawel Wodkowski	local ret=0
417db1236efSPawel Wodkowski	local i
418db1236efSPawel Wodkowski	for (( i = 40; i != 0; i-- )); do
419c9e5d2a6SSeth Howell		# if the process is no longer running, then exit the script
420c9e5d2a6SSeth Howell		#  since it means the application crashed
421c9e5d2a6SSeth Howell		if ! kill -s 0 $1; then
422db1236efSPawel Wodkowski			echo "ERROR: process (pid: $1) is no longer running"
423f751ea17SPawel Wodkowski			ret=1
424f751ea17SPawel Wodkowski			break
425c9e5d2a6SSeth Howell		fi
4265bafc240STomasz Zawadzki
4276ee44c69SJim Harris		if $rootdir/scripts/rpc.py -t 1 -s "$rpc_addr" rpc_get_methods &>/dev/null; then
428db1236efSPawel Wodkowski			break
429c9e5d2a6SSeth Howell		fi
43082583134SDarek Stojaczyk
431db1236efSPawel Wodkowski		sleep 0.5
432c9e5d2a6SSeth Howell	done
433f751ea17SPawel Wodkowski
4343b660ea8SDarek Stojaczyk	xtrace_restore
435db1236efSPawel Wodkowski	if (( i == 0 )); then
436db1236efSPawel Wodkowski		echo "ERROR: timeout while waiting for process (pid: $1) to start listening on '$rpc_addr'"
437db1236efSPawel Wodkowski		ret=1
438f751ea17SPawel Wodkowski	fi
439db1236efSPawel Wodkowski	return $ret
440c9e5d2a6SSeth Howell}
441c9e5d2a6SSeth Howell
442c9e5d2a6SSeth Howellfunction waitfornbd() {
443bf9dbae5SPawel Wodkowski	local nbd_name=$1
444bf9dbae5SPawel Wodkowski	local i
445c9e5d2a6SSeth Howell
446c9e5d2a6SSeth Howell	for ((i=1; i<=20; i++)); do
447c9e5d2a6SSeth Howell		if grep -q -w $nbd_name /proc/partitions; then
448c9e5d2a6SSeth Howell			break
449c9e5d2a6SSeth Howell		else
450c9e5d2a6SSeth Howell			sleep 0.1
451c9e5d2a6SSeth Howell		fi
452c9e5d2a6SSeth Howell	done
453c9e5d2a6SSeth Howell
454c9e5d2a6SSeth Howell	# The nbd device is now recognized as a block device, but there can be
455c9e5d2a6SSeth Howell	#  a small delay before we can start I/O to that block device.  So loop
456c9e5d2a6SSeth Howell	#  here trying to read the first block of the nbd block device to a temp
457c9e5d2a6SSeth Howell	#  file.  Note that dd returns success when reading an empty file, so we
458c9e5d2a6SSeth Howell	#  need to check the size of the output file instead.
459c9e5d2a6SSeth Howell	for ((i=1; i<=20; i++)); do
460c9e5d2a6SSeth Howell		dd if=/dev/$nbd_name of=/tmp/nbdtest bs=4096 count=1 iflag=direct
461fb9c4ee6SKarol Latecki		size=$(stat -c %s /tmp/nbdtest)
462c9e5d2a6SSeth Howell		rm -f /tmp/nbdtest
463c9e5d2a6SSeth Howell		if [ "$size" != "0" ]; then
464c9e5d2a6SSeth Howell			return 0
465c9e5d2a6SSeth Howell		else
466c9e5d2a6SSeth Howell			sleep 0.1
467c9e5d2a6SSeth Howell		fi
468c9e5d2a6SSeth Howell	done
469c9e5d2a6SSeth Howell
470c9e5d2a6SSeth Howell	return 1
471c9e5d2a6SSeth Howell}
472c9e5d2a6SSeth Howell
473975e4614Spaul lusefunction waitforbdev() {
474975e4614Spaul luse	local bdev_name=$1
475975e4614Spaul luse	local i
476975e4614Spaul luse
477975e4614Spaul luse	for ((i=1; i<=20; i++)); do
478ab854135SBen Walker		if $rpc_py bdev_get_bdevs | jq -r '.[] .name' | grep -qw $bdev_name; then
479975e4614Spaul luse			return 0
480975e4614Spaul luse		fi
481ab854135SBen Walker
482ab854135SBen Walker		if $rpc_py bdev_get_bdevs | jq -r '.[] .aliases' | grep -qw $bdev_name; then
483ab854135SBen Walker			return 0
484ab854135SBen Walker		fi
485ab854135SBen Walker
486ab854135SBen Walker		sleep 0.1
487975e4614Spaul luse	done
488975e4614Spaul luse
489975e4614Spaul luse	return 1
490975e4614Spaul luse}
491975e4614Spaul luse
492c9e5d2a6SSeth Howellfunction killprocess() {
493c9e5d2a6SSeth Howell	# $1 = process pid
494c9e5d2a6SSeth Howell	if [ -z "$1" ]; then
495c9e5d2a6SSeth Howell		exit 1
496c9e5d2a6SSeth Howell	fi
497c9e5d2a6SSeth Howell
498f0a2cc82SKarol Latecki	if kill -0 $1; then
499714a5646SBen Walker		if [ "$(ps --no-headers -o comm= $1)" = "sudo" ]; then
500714a5646SBen Walker			# kill the child process, which is the actual app
501714a5646SBen Walker			# (assume $1 has just one child)
502074df1d8SPawel Kaminski			local child
503074df1d8SPawel Kaminski			child="$(pgrep -P $1)"
504714a5646SBen Walker			echo "killing process with pid $child"
505714a5646SBen Walker			kill $child
506714a5646SBen Walker		else
507c9e5d2a6SSeth Howell			echo "killing process with pid $1"
508c9e5d2a6SSeth Howell			kill $1
509714a5646SBen Walker		fi
510714a5646SBen Walker
511714a5646SBen Walker		# wait for the process regardless if its the dummy sudo one
512714a5646SBen Walker		# or the actual app - it should terminate anyway
513c9e5d2a6SSeth Howell		wait $1
51482f60376SGangCao	else
51582f60376SGangCao		# the process is not there anymore
51682f60376SGangCao		echo "Process with pid $1 is not found"
51782f60376SGangCao		exit 1
518f0a2cc82SKarol Latecki	fi
519c9e5d2a6SSeth Howell}
520c9e5d2a6SSeth Howell
521c9e5d2a6SSeth Howellfunction iscsicleanup() {
522c9e5d2a6SSeth Howell	echo "Cleaning up iSCSI connection"
523c9e5d2a6SSeth Howell	iscsiadm -m node --logout || true
524c9e5d2a6SSeth Howell	iscsiadm -m node -o delete || true
525c9e5d2a6SSeth Howell}
526c9e5d2a6SSeth Howell
527c9e5d2a6SSeth Howellfunction stop_iscsi_service() {
528c9e5d2a6SSeth Howell	if cat /etc/*-release | grep Ubuntu; then
529c9e5d2a6SSeth Howell		service open-iscsi stop
530c9e5d2a6SSeth Howell	else
531c9e5d2a6SSeth Howell		service iscsid stop
532c9e5d2a6SSeth Howell	fi
533c9e5d2a6SSeth Howell}
534c9e5d2a6SSeth Howell
535c9e5d2a6SSeth Howellfunction start_iscsi_service() {
536c9e5d2a6SSeth Howell	if cat /etc/*-release | grep Ubuntu; then
537c9e5d2a6SSeth Howell		service open-iscsi start
538c9e5d2a6SSeth Howell	else
539c9e5d2a6SSeth Howell		service iscsid start
540c9e5d2a6SSeth Howell	fi
541c9e5d2a6SSeth Howell}
542c9e5d2a6SSeth Howell
543c9e5d2a6SSeth Howellfunction rbd_setup() {
5440629b01dSTomasz Zawadzki	# $1 = monitor ip address
5455bafc240STomasz Zawadzki	# $2 = name of the namespace
5460629b01dSTomasz Zawadzki	if [ -z "$1" ]; then
5470629b01dSTomasz Zawadzki		echo "No monitor IP address provided for ceph"
5480629b01dSTomasz Zawadzki		exit 1
5490629b01dSTomasz Zawadzki	fi
5505bafc240STomasz Zawadzki	if [ -n "$2" ]; then
5515bafc240STomasz Zawadzki		if ip netns list | grep "$2"; then
5525bafc240STomasz Zawadzki			NS_CMD="ip netns exec $2"
5535bafc240STomasz Zawadzki		else
5545bafc240STomasz Zawadzki			echo "No namespace $2 exists"
5555bafc240STomasz Zawadzki			exit 1
5565bafc240STomasz Zawadzki		fi
5575bafc240STomasz Zawadzki	fi
5580629b01dSTomasz Zawadzki
559c9e5d2a6SSeth Howell	if hash ceph; then
560397521bdSSeth Howell		export PG_NUM=128
561c9e5d2a6SSeth Howell		export RBD_POOL=rbd
562c9e5d2a6SSeth Howell		export RBD_NAME=foo
5636907c36fSyidong0635		$NS_CMD $rootdir/scripts/ceph/stop.sh || true
5645bafc240STomasz Zawadzki		$NS_CMD $rootdir/scripts/ceph/start.sh $1
565397521bdSSeth Howell
5665bafc240STomasz Zawadzki		$NS_CMD ceph osd pool create $RBD_POOL $PG_NUM || true
5675bafc240STomasz Zawadzki		$NS_CMD rbd create $RBD_NAME --size 1000
568c9e5d2a6SSeth Howell	fi
569c9e5d2a6SSeth Howell}
570c9e5d2a6SSeth Howell
571c9e5d2a6SSeth Howellfunction rbd_cleanup() {
572c9e5d2a6SSeth Howell	if hash ceph; then
573d51ea8deSDaniel Verkamp		$rootdir/scripts/ceph/stop.sh || true
574ab1622aaSKarol Latecki		rm -f /var/tmp/ceph_raw.img
575c9e5d2a6SSeth Howell	fi
576c9e5d2a6SSeth Howell}
577c9e5d2a6SSeth Howell
578*9ba80de0SMichal Bergerfunction _start_stub() {
57918f3a22bSJim Harris	# Disable ASLR for multi-process testing.  SPDK does support using DPDK multi-process,
5809d04d0efSJim Harris	# but ASLR can still be unreliable in some cases.
5814b1dbc94SMichal Berger	# We will reenable it again after multi-process testing is complete in kill_stub().
5824b1dbc94SMichal Berger	# Save current setting so it can be restored upon calling kill_stub().
5834b1dbc94SMichal Berger	_randomize_va_space=$(</proc/sys/kernel/randomize_va_space)
58418f3a22bSJim Harris	echo 0 > /proc/sys/kernel/randomize_va_space
585c9e5d2a6SSeth Howell	$rootdir/test/app/stub/stub $1 &
586c9e5d2a6SSeth Howell	stubpid=$!
587c9e5d2a6SSeth Howell	echo Waiting for stub to ready for secondary processes...
588c9e5d2a6SSeth Howell	while ! [ -e /var/run/spdk_stub0 ]; do
589*9ba80de0SMichal Berger		# If stub dies while we wait, bail
590*9ba80de0SMichal Berger		[[ -e /proc/$stubpid ]] || return 1
591c9e5d2a6SSeth Howell		sleep 1s
592c9e5d2a6SSeth Howell	done
593c9e5d2a6SSeth Howell	echo done.
594c9e5d2a6SSeth Howell}
595c9e5d2a6SSeth Howell
596*9ba80de0SMichal Bergerfunction start_stub() {
597*9ba80de0SMichal Berger	if ! _start_stub "$@"; then
598*9ba80de0SMichal Berger		echo "stub failed" >&2
599*9ba80de0SMichal Berger		return 1
600*9ba80de0SMichal Berger	fi
601*9ba80de0SMichal Berger}
602*9ba80de0SMichal Berger
603c9e5d2a6SSeth Howellfunction kill_stub() {
604*9ba80de0SMichal Berger	if [[ -e /proc/$stubpid ]]; then
605ef6832efSJim Harris		kill $1 $stubpid
606c9e5d2a6SSeth Howell		wait $stubpid
607*9ba80de0SMichal Berger	fi 2>/dev/null || :
608c9e5d2a6SSeth Howell	rm -f /var/run/spdk_stub0
60918f3a22bSJim Harris	# Re-enable ASLR now that we are done with multi-process testing
61018f3a22bSJim Harris	# Note: "1" enables ASLR w/o randomizing data segments, "2" adds data segment
61118f3a22bSJim Harris	#  randomizing and is the default on all recent Linux kernels
6124b1dbc94SMichal Berger	echo "${_randomize_va_space:-2}" > /proc/sys/kernel/randomize_va_space
613c9e5d2a6SSeth Howell}
614c9e5d2a6SSeth Howell
615c9e5d2a6SSeth Howellfunction run_test() {
616cb90136cSSeth Howell	if [ $# -le 1 ]; then
617fd17f1aaSSeth Howell		echo "Not enough parameters"
618cb90136cSSeth Howell		echo "usage: run_test test_name test_script [script_params]"
619fd17f1aaSSeth Howell		exit 1
620fd17f1aaSSeth Howell	fi
621fd17f1aaSSeth Howell
6223b660ea8SDarek Stojaczyk	xtrace_disable
62337100484SSeth Howell	local test_name="$1"
62437100484SSeth Howell	shift
6251fafd71bSSeth Howell
626ea781d6dSSeth Howell	if [ -n "$test_domain" ]; then
627ea781d6dSSeth Howell		export test_domain="${test_domain}.${test_name}"
628ea781d6dSSeth Howell	else
629ea781d6dSSeth Howell		export test_domain="$test_name"
630ea781d6dSSeth Howell	fi
631ea781d6dSSeth Howell
6321fafd71bSSeth Howell	timing_enter $test_name
633c9e5d2a6SSeth Howell	echo "************************************"
634cb90136cSSeth Howell	echo "START TEST $test_name"
635c9e5d2a6SSeth Howell	echo "************************************"
6363b660ea8SDarek Stojaczyk	xtrace_restore
637c9e5d2a6SSeth Howell	time "$@"
6383b660ea8SDarek Stojaczyk	xtrace_disable
639c9e5d2a6SSeth Howell	echo "************************************"
640cb90136cSSeth Howell	echo "END TEST $test_name"
641c9e5d2a6SSeth Howell	echo "************************************"
6421fafd71bSSeth Howell	timing_exit $test_name
643ea781d6dSSeth Howell
644ea781d6dSSeth Howell	export test_domain=${test_domain%"$test_name"}
645ea781d6dSSeth Howell	if [ -n "$test_domain" ]; then
646ea781d6dSSeth Howell		export test_domain=${test_domain%?}
647ea781d6dSSeth Howell	fi
648ea781d6dSSeth Howell
649ea781d6dSSeth Howell	if [ -z "$test_domain" ]; then
650ea781d6dSSeth Howell		echo "top_level $test_name" >> $output_dir/test_completions.txt
651ea781d6dSSeth Howell	else
652ea781d6dSSeth Howell		echo "$test_domain $test_name" >> $output_dir/test_completions.txt
653ea781d6dSSeth Howell	fi
6543b660ea8SDarek Stojaczyk	xtrace_restore
655c9e5d2a6SSeth Howell}
656c9e5d2a6SSeth Howell
657c9e5d2a6SSeth Howellfunction print_backtrace() {
658b5d1b4f4SJim Harris	# if errexit is not enabled, don't print a backtrace
659b5d1b4f4SJim Harris	[[ "$-" =~ e ]] || return 0
660b5d1b4f4SJim Harris
66118b9303dSMichal Berger	local args=("${BASH_ARGV[@]}")
66218b9303dSMichal Berger
6633b660ea8SDarek Stojaczyk	xtrace_disable
664c9e5d2a6SSeth Howell	echo "========== Backtrace start: =========="
665c9e5d2a6SSeth Howell	echo ""
666c9e5d2a6SSeth Howell	for i in $(seq 1 $((${#FUNCNAME[@]} - 1))); do
667c9e5d2a6SSeth Howell		local func="${FUNCNAME[$i]}"
668c9e5d2a6SSeth Howell		local line_nr="${BASH_LINENO[$((i - 1))]}"
669c9e5d2a6SSeth Howell		local src="${BASH_SOURCE[$i]}"
67018b9303dSMichal Berger		local bt="" cmdline=()
6711baf379eSMichal Berger
6721baf379eSMichal Berger		if [[ -f $src ]]; then
6731baf379eSMichal Berger			bt=$(nl -w 4 -ba -nln $src | grep -B 5 -A 5 "^${line_nr}[^0-9]" | \
6741baf379eSMichal Berger			  sed "s/^/   /g" | sed "s/^   $line_nr /=> $line_nr /g")
6751baf379eSMichal Berger		fi
6761baf379eSMichal Berger
67718b9303dSMichal Berger		# If extdebug set the BASH_ARGC[i], try to fetch all the args
67818b9303dSMichal Berger		if (( BASH_ARGC[i] > 0 )); then
67918b9303dSMichal Berger			# Use argc as index to reverse the stack
68018b9303dSMichal Berger			local argc=${BASH_ARGC[i]} arg
68118b9303dSMichal Berger			for arg in "${args[@]::BASH_ARGC[i]}"; do
68218b9303dSMichal Berger				cmdline[argc--]="[\"$arg\"]"
68318b9303dSMichal Berger			done
68418b9303dSMichal Berger			args=("${args[@]:BASH_ARGC[i]}")
68518b9303dSMichal Berger		fi
68618b9303dSMichal Berger
68718b9303dSMichal Berger		echo "in $src:$line_nr -> $func($(IFS=","; printf '%s\n' "${cmdline[*]:-[]}"))"
688c9e5d2a6SSeth Howell		echo "     ..."
6891baf379eSMichal Berger		echo "${bt:-backtrace unavailable}"
690c9e5d2a6SSeth Howell		echo "     ..."
691c9e5d2a6SSeth Howell	done
692c9e5d2a6SSeth Howell	echo ""
693c9e5d2a6SSeth Howell	echo "========== Backtrace end =========="
6943b660ea8SDarek Stojaczyk	xtrace_restore
695c9e5d2a6SSeth Howell	return 0
696c9e5d2a6SSeth Howell}
697c9e5d2a6SSeth Howell
698c9e5d2a6SSeth Howellfunction part_dev_by_gpt () {
699c9e5d2a6SSeth Howell	if [ $(uname -s) = Linux ] && hash sgdisk && modprobe nbd; then
700c9e5d2a6SSeth Howell		conf=$1
701c9e5d2a6SSeth Howell		devname=$2
702c9e5d2a6SSeth Howell		rootdir=$3
703c9e5d2a6SSeth Howell		operation=$4
704c9e5d2a6SSeth Howell		local nbd_path=/dev/nbd0
705c9e5d2a6SSeth Howell		local rpc_server=/var/tmp/spdk-gpt-bdevs.sock
706c9e5d2a6SSeth Howell
707c9e5d2a6SSeth Howell		if [ ! -e $conf ]; then
708c9e5d2a6SSeth Howell			return 1
709c9e5d2a6SSeth Howell		fi
710c9e5d2a6SSeth Howell
711c9e5d2a6SSeth Howell		if [ -z "$operation" ]; then
712c9e5d2a6SSeth Howell			operation="create"
713c9e5d2a6SSeth Howell		fi
714c9e5d2a6SSeth Howell
715c9e5d2a6SSeth Howell		cp $conf ${conf}.gpt
716c9e5d2a6SSeth Howell		echo "[Gpt]" >> ${conf}.gpt
717c9e5d2a6SSeth Howell		echo "  Disable Yes" >> ${conf}.gpt
718c9e5d2a6SSeth Howell
719c9e5d2a6SSeth Howell		$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -c ${conf}.gpt &
720c9e5d2a6SSeth Howell		nbd_pid=$!
721c9e5d2a6SSeth Howell		echo "Process nbd pid: $nbd_pid"
722c9e5d2a6SSeth Howell		waitforlisten $nbd_pid $rpc_server
723c9e5d2a6SSeth Howell
724793d34e5Spaul luse		# Start bdev as an nbd device
725bf9dbae5SPawel Wodkowski		nbd_start_disks "$rpc_server" $devname $nbd_path
726c9e5d2a6SSeth Howell
727c9e5d2a6SSeth Howell		waitfornbd ${nbd_path:5}
728c9e5d2a6SSeth Howell
729c9e5d2a6SSeth Howell		if [ "$operation" = create ]; then
730c9e5d2a6SSeth Howell			parted -s $nbd_path mklabel gpt mkpart first '0%' '50%' mkpart second '50%' '100%'
731c9e5d2a6SSeth Howell
732c9e5d2a6SSeth Howell			# change the GUID to SPDK GUID value
73307fe6a43SSeth Howell			SPDK_GPT_GUID=$(grep SPDK_GPT_PART_TYPE_GUID $rootdir/module/bdev/gpt/gpt.h \
734c9e5d2a6SSeth Howell				| awk -F "(" '{ print $2}' | sed 's/)//g' \
735fb9c4ee6SKarol Latecki				| awk -F ", " '{ print $1 "-" $2 "-" $3 "-" $4 "-" $5}' | sed 's/0x//g')
736c9e5d2a6SSeth Howell			sgdisk -t 1:$SPDK_GPT_GUID $nbd_path
737c9e5d2a6SSeth Howell			sgdisk -t 2:$SPDK_GPT_GUID $nbd_path
738c9e5d2a6SSeth Howell		elif [ "$operation" = reset ]; then
739c9e5d2a6SSeth Howell			# clear the partition table
740c9e5d2a6SSeth Howell			dd if=/dev/zero of=$nbd_path bs=4096 count=8 oflag=direct
741c9e5d2a6SSeth Howell		fi
742c9e5d2a6SSeth Howell
743bf9dbae5SPawel Wodkowski		nbd_stop_disks "$rpc_server" $nbd_path
744d891b398SShuhei Matsumoto
745c9e5d2a6SSeth Howell		killprocess $nbd_pid
746c9e5d2a6SSeth Howell		rm -f ${conf}.gpt
747c9e5d2a6SSeth Howell	fi
748c9e5d2a6SSeth Howell
749c9e5d2a6SSeth Howell	return 0
750c9e5d2a6SSeth Howell}
751c9e5d2a6SSeth Howell
752c9e5d2a6SSeth Howellfunction discover_bdevs()
753c9e5d2a6SSeth Howell{
754c9e5d2a6SSeth Howell	local rootdir=$1
755c9e5d2a6SSeth Howell	local config_file=$2
756c9e5d2a6SSeth Howell	local rpc_server=/var/tmp/spdk-discover-bdevs.sock
757c9e5d2a6SSeth Howell
758c9e5d2a6SSeth Howell	if [ ! -e $config_file ]; then
759c9e5d2a6SSeth Howell		echo "Invalid Configuration File: $config_file"
76039e8a95cSPawel Kaminski		return 1
761c9e5d2a6SSeth Howell	fi
762c9e5d2a6SSeth Howell
763c9e5d2a6SSeth Howell	# Start the bdev service to query for the list of available
764c9e5d2a6SSeth Howell	# bdevs.
76533df76dcSSeth Howell	$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 \
7668e6b1fbdSDariusz Stojaczyk		-c $config_file &>/dev/null &
767c9e5d2a6SSeth Howell	stubpid=$!
768c9e5d2a6SSeth Howell	while ! [ -e /var/run/spdk_bdev0 ]; do
769c9e5d2a6SSeth Howell		sleep 1
770c9e5d2a6SSeth Howell	done
771c9e5d2a6SSeth Howell
772c9e5d2a6SSeth Howell	# Get all of the bdevs
773c9e5d2a6SSeth Howell	if [ -z "$rpc_server" ]; then
7742c49e910SMaciej Wawryk		$rootdir/scripts/rpc.py bdev_get_bdevs
775c9e5d2a6SSeth Howell	else
7762c49e910SMaciej Wawryk		$rootdir/scripts/rpc.py -s "$rpc_server" bdev_get_bdevs
777c9e5d2a6SSeth Howell	fi
778c9e5d2a6SSeth Howell
779c9e5d2a6SSeth Howell	# Shut down the bdev service
780c9e5d2a6SSeth Howell	kill $stubpid
781c9e5d2a6SSeth Howell	wait $stubpid
782c9e5d2a6SSeth Howell	rm -f /var/run/spdk_bdev0
783c9e5d2a6SSeth Howell}
784c9e5d2a6SSeth Howell
78553147e0dSMaciej Wawrykfunction waitforserial()
78653147e0dSMaciej Wawryk{
78753147e0dSMaciej Wawryk	local i=0
78853147e0dSMaciej Wawryk	local nvme_device_counter=1
78953147e0dSMaciej Wawryk	if [[ -n "$2" ]]; then
79053147e0dSMaciej Wawryk		nvme_device_counter=$2
79153147e0dSMaciej Wawryk	fi
79253147e0dSMaciej Wawryk
79353147e0dSMaciej Wawryk	while [ $(lsblk -l -o NAME,SERIAL | grep -c $1) -lt $nvme_device_counter ]; do
79453147e0dSMaciej Wawryk		[ $i -lt 15 ] || break
79553147e0dSMaciej Wawryk		i=$((i+1))
79653147e0dSMaciej Wawryk		echo "Waiting for devices"
79753147e0dSMaciej Wawryk		sleep 1
79853147e0dSMaciej Wawryk	done
79953147e0dSMaciej Wawryk
80053147e0dSMaciej Wawryk	if [[ $(lsblk -l -o NAME,SERIAL | grep -c $1) -lt $nvme_device_counter ]]; then
80153147e0dSMaciej Wawryk		return 1
80253147e0dSMaciej Wawryk	fi
80353147e0dSMaciej Wawryk
80453147e0dSMaciej Wawryk        return 0
80553147e0dSMaciej Wawryk}
80653147e0dSMaciej Wawryk
80753147e0dSMaciej Wawrykfunction waitforserial_disconnect()
80853147e0dSMaciej Wawryk{
80953147e0dSMaciej Wawryk	local i=0
81053147e0dSMaciej Wawryk	while lsblk -o NAME,SERIAL | grep -q -w $1; do
81153147e0dSMaciej Wawryk		[ $i -lt 15 ] || break
81253147e0dSMaciej Wawryk		i=$((i+1))
81353147e0dSMaciej Wawryk		echo "Waiting for disconnect devices"
81453147e0dSMaciej Wawryk		sleep 1
81553147e0dSMaciej Wawryk	done
81653147e0dSMaciej Wawryk
81753147e0dSMaciej Wawryk	if lsblk -l -o NAME | grep -q -w $1; then
81853147e0dSMaciej Wawryk		return 1
81953147e0dSMaciej Wawryk	fi
82053147e0dSMaciej Wawryk
82153147e0dSMaciej Wawryk	return 0
82253147e0dSMaciej Wawryk}
82353147e0dSMaciej Wawryk
824e3263286SSeth Howellfunction waitforblk()
825e3263286SSeth Howell{
826e3263286SSeth Howell	local i=0
827e3263286SSeth Howell	while ! lsblk -l -o NAME | grep -q -w $1; do
828e3263286SSeth Howell		[ $i -lt 15 ] || break
8290f0cd0a8SKarol Latecki		i=$((i+1))
830e3263286SSeth Howell		sleep 1
831e3263286SSeth Howell	done
832e3263286SSeth Howell
833e3263286SSeth Howell	if ! lsblk -l -o NAME | grep -q -w $1; then
834e3263286SSeth Howell		return 1
835e3263286SSeth Howell	fi
836e3263286SSeth Howell
837e3263286SSeth Howell	return 0
838e3263286SSeth Howell}
839e3263286SSeth Howell
8405232a73fSSeth Howellfunction waitforblk_disconnect()
8415232a73fSSeth Howell{
8425232a73fSSeth Howell	local i=0
8435232a73fSSeth Howell	while lsblk -l -o NAME | grep -q -w $1; do
8445232a73fSSeth Howell		[ $i -lt 15 ] || break
8450f0cd0a8SKarol Latecki		i=$((i+1))
8465232a73fSSeth Howell		sleep 1
8475232a73fSSeth Howell	done
8485232a73fSSeth Howell
8495232a73fSSeth Howell	if lsblk -l -o NAME | grep -q -w $1; then
8505232a73fSSeth Howell		return 1
8515232a73fSSeth Howell	fi
8525232a73fSSeth Howell
8535232a73fSSeth Howell	return 0
8545232a73fSSeth Howell}
8555232a73fSSeth Howell
856b118729fSJim Harrisfunction waitforfile()
857b118729fSJim Harris{
858b118729fSJim Harris	local i=0
859a44c7434STomasz Kulasek	while [ ! -e $1 ]; do
860b118729fSJim Harris		[ $i -lt 200 ] || break
8610f0cd0a8SKarol Latecki		i=$((i+1))
862b118729fSJim Harris		sleep 0.1
863b118729fSJim Harris	done
864b118729fSJim Harris
865a44c7434STomasz Kulasek	if [ ! -e $1 ]; then
866b118729fSJim Harris		return 1
867b118729fSJim Harris	fi
868b118729fSJim Harris
869b118729fSJim Harris	return 0
870b118729fSJim Harris}
871b118729fSJim Harris
872c9e5d2a6SSeth Howellfunction fio_config_gen()
873c9e5d2a6SSeth Howell{
874c9e5d2a6SSeth Howell	local config_file=$1
875c9e5d2a6SSeth Howell	local workload=$2
8763fbc84d3SGangCao	local bdev_type=$3
8773fbc84d3SGangCao	local fio_dir="/usr/src/fio"
878c9e5d2a6SSeth Howell
879c9e5d2a6SSeth Howell	if [ -e "$config_file" ]; then
880c9e5d2a6SSeth Howell		echo "Configuration File Already Exists!: $config_file"
88139e8a95cSPawel Kaminski		return 1
882c9e5d2a6SSeth Howell	fi
883c9e5d2a6SSeth Howell
884c9e5d2a6SSeth Howell	if [ -z "$workload" ]; then
885c9e5d2a6SSeth Howell		workload=randrw
886c9e5d2a6SSeth Howell	fi
887c9e5d2a6SSeth Howell
888c9e5d2a6SSeth Howell	touch $1
889c9e5d2a6SSeth Howell
890c9e5d2a6SSeth Howell	cat > $1 << EOL
891c9e5d2a6SSeth Howell[global]
892c9e5d2a6SSeth Howellthread=1
893c9e5d2a6SSeth Howellgroup_reporting=1
894c9e5d2a6SSeth Howelldirect=1
895c9e5d2a6SSeth Howellnorandommap=1
896c9e5d2a6SSeth Howellpercentile_list=50:99:99.9:99.99:99.999
897c9e5d2a6SSeth Howelltime_based=1
898c9e5d2a6SSeth Howellramp_time=0
899c9e5d2a6SSeth HowellEOL
900c9e5d2a6SSeth Howell
901c9e5d2a6SSeth Howell	if [ "$workload" == "verify" ]; then
90202925187SMaciej Wawryk		cat <<- EOL >> $config_file
90302925187SMaciej Wawryk		verify=sha1
90402925187SMaciej Wawryk		verify_backlog=1024
90502925187SMaciej Wawryk		rw=randwrite
90602925187SMaciej Wawryk		EOL
9073fbc84d3SGangCao
9083fbc84d3SGangCao		# To avoid potential data race issue due to the AIO device
9093fbc84d3SGangCao		# flush mechanism, add the flag to serialize the writes.
9103fbc84d3SGangCao		# This is to fix the intermittent IO failure issue of #935
9113fbc84d3SGangCao		if [ "$bdev_type" == "AIO" ]; then
9123fbc84d3SGangCao			if [[ $($fio_dir/fio --version) == *"fio-3"* ]]; then
9133fbc84d3SGangCao				echo "serialize_overlap=1" >> $config_file
9143fbc84d3SGangCao			fi
9153fbc84d3SGangCao		fi
916c9e5d2a6SSeth Howell	elif [ "$workload" == "trim" ]; then
917c9e5d2a6SSeth Howell		echo "rw=trimwrite" >> $config_file
918c9e5d2a6SSeth Howell	else
919c9e5d2a6SSeth Howell		echo "rw=$workload" >> $config_file
920c9e5d2a6SSeth Howell	fi
921c9e5d2a6SSeth Howell}
922c9e5d2a6SSeth Howell
923c9e5d2a6SSeth Howellfunction fio_config_add_job()
924c9e5d2a6SSeth Howell{
925c9e5d2a6SSeth Howell	config_file=$1
926c9e5d2a6SSeth Howell	filename=$2
927c9e5d2a6SSeth Howell
928c9e5d2a6SSeth Howell	if [ ! -e "$config_file" ]; then
929c9e5d2a6SSeth Howell		echo "Configuration File Doesn't Exist: $config_file"
93039e8a95cSPawel Kaminski		return 1
931c9e5d2a6SSeth Howell	fi
932c9e5d2a6SSeth Howell
933c9e5d2a6SSeth Howell	if [ -z "$filename" ]; then
934c9e5d2a6SSeth Howell		echo "No filename provided"
93539e8a95cSPawel Kaminski		return 1
936c9e5d2a6SSeth Howell	fi
937c9e5d2a6SSeth Howell
938c9e5d2a6SSeth Howell	echo "[job_$filename]" >> $config_file
939c9e5d2a6SSeth Howell	echo "filename=$filename" >> $config_file
940c9e5d2a6SSeth Howell}
941c9e5d2a6SSeth Howell
9423b9db6c4STomasz Zawadzkifunction fio_bdev()
9433b9db6c4STomasz Zawadzki{
9443b9db6c4STomasz Zawadzki	# Setup fio binary cmd line
9453b9db6c4STomasz Zawadzki	local fio_dir="/usr/src/fio"
9463b9db6c4STomasz Zawadzki	local bdev_plugin="$rootdir/examples/bdev/fio_plugin/fio_plugin"
9473b9db6c4STomasz Zawadzki
9481bed9c1fSTomasz Zawadzki	# Preload AddressSanitizer library to fio if fio_plugin was compiled with it
949074df1d8SPawel Kaminski	local asan_lib
950074df1d8SPawel Kaminski	asan_lib=$(ldd $bdev_plugin | grep libasan | awk '{print $3}')
9511bed9c1fSTomasz Zawadzki
9521db9e184SMaciej Wawryk	LD_PRELOAD="$asan_lib $bdev_plugin" "$fio_dir"/fio "$@"
9533b9db6c4STomasz Zawadzki}
9543b9db6c4STomasz Zawadzki
9553b9db6c4STomasz Zawadzkifunction fio_nvme()
9563b9db6c4STomasz Zawadzki{
9573b9db6c4STomasz Zawadzki	# Setup fio binary cmd line
9583b9db6c4STomasz Zawadzki	local fio_dir="/usr/src/fio"
9593b9db6c4STomasz Zawadzki	local nvme_plugin="$rootdir/examples/nvme/fio_plugin/fio_plugin"
9603b9db6c4STomasz Zawadzki
9611bed9c1fSTomasz Zawadzki	# Preload AddressSanitizer library to fio if fio_plugin was compiled with it
9621bed9c1fSTomasz Zawadzki	asan_lib=$(ldd $nvme_plugin | grep libasan | awk '{print $3}')
9631bed9c1fSTomasz Zawadzki
9641db9e184SMaciej Wawryk	LD_PRELOAD="$asan_lib $nvme_plugin" "$fio_dir"/fio "$@"
9653b9db6c4STomasz Zawadzki}
9663b9db6c4STomasz Zawadzki
967c9e5d2a6SSeth Howellfunction get_lvs_free_mb()
968c9e5d2a6SSeth Howell{
969c9e5d2a6SSeth Howell	local lvs_uuid=$1
970074df1d8SPawel Kaminski	local lvs_info
971074df1d8SPawel Kaminski	local fc
972074df1d8SPawel Kaminski	local cs
973074df1d8SPawel Kaminski	lvs_info=$($rpc_py bdev_lvol_get_lvstores)
974074df1d8SPawel Kaminski	fc=$(jq ".[] | select(.uuid==\"$lvs_uuid\") .free_clusters" <<< "$lvs_info")
975074df1d8SPawel Kaminski	cs=$(jq ".[] | select(.uuid==\"$lvs_uuid\") .cluster_size" <<< "$lvs_info")
976c9e5d2a6SSeth Howell
977c9e5d2a6SSeth Howell	# Change to MB's
978c9e5d2a6SSeth Howell	free_mb=$((fc*cs/1024/1024))
979c9e5d2a6SSeth Howell	echo "$free_mb"
980c9e5d2a6SSeth Howell}
981c9e5d2a6SSeth Howell
982c9e5d2a6SSeth Howellfunction get_bdev_size()
983c9e5d2a6SSeth Howell{
984c9e5d2a6SSeth Howell	local bdev_name=$1
985074df1d8SPawel Kaminski	local bdev_info
986074df1d8SPawel Kaminski	local bs
987074df1d8SPawel Kaminski	local nb
988074df1d8SPawel Kaminski	bdev_info=$($rpc_py bdev_get_bdevs -b $bdev_name)
989074df1d8SPawel Kaminski	bs=$(jq ".[] .block_size" <<< "$bdev_info")
990074df1d8SPawel Kaminski	nb=$(jq ".[] .num_blocks" <<< "$bdev_info")
991c9e5d2a6SSeth Howell
992c9e5d2a6SSeth Howell	# Change to MB's
993c9e5d2a6SSeth Howell	bdev_size=$((bs*nb/1024/1024))
994c9e5d2a6SSeth Howell	echo "$bdev_size"
995c9e5d2a6SSeth Howell}
996c9e5d2a6SSeth Howell
997d1f9da82SSeth Howellfunction autotest_cleanup()
998d1f9da82SSeth Howell{
999d1f9da82SSeth Howell	$rootdir/scripts/setup.sh reset
1000af32aa1bSKarol Latecki	$rootdir/scripts/setup.sh cleanup
1001d63d4d5aSSeth Howell	if [ $(uname -s) = "Linux" ]; then
1002d63d4d5aSSeth Howell		if grep -q '#define SPDK_CONFIG_IGB_UIO_DRIVER 1' $rootdir/include/spdk/config.h; then
1003d63d4d5aSSeth Howell			rmmod igb_uio
1004d63d4d5aSSeth Howell		else
1005d63d4d5aSSeth Howell			modprobe -r uio_pci_generic
1006d63d4d5aSSeth Howell		fi
1007d63d4d5aSSeth Howell	fi
10089fda9814STomasz Zawadzki	rm -rf "$asan_suppression_file"
1009d1f9da82SSeth Howell}
1010d1f9da82SSeth Howell
101186ee572bSSeth Howellfunction freebsd_update_contigmem_mod()
101286ee572bSSeth Howell{
1013fb9c4ee6SKarol Latecki	if [ $(uname) = FreeBSD ]; then
101486ee572bSSeth Howell		kldunload contigmem.ko || true
10151ccc878eSKarol Latecki		if [ -n "$WITH_DPDK_DIR" ]; then
1016d68ee5b4SDarek Stojaczyk			echo "Warning: SPDK only works on FreeBSD with patches that only exist in SPDK's dpdk submodule"
1017d68ee5b4SDarek Stojaczyk			cp -f "$WITH_DPDK_DIR/kmod/contigmem.ko" /boot/modules/
1018d68ee5b4SDarek Stojaczyk			cp -f "$WITH_DPDK_DIR/kmod/contigmem.ko" /boot/kernel/
1019d68ee5b4SDarek Stojaczyk		else
1020d68ee5b4SDarek Stojaczyk			cp -f "$rootdir/dpdk/build/kmod/contigmem.ko" /boot/modules/
1021d68ee5b4SDarek Stojaczyk			cp -f "$rootdir/dpdk/build/kmod/contigmem.ko" /boot/kernel/
1022d68ee5b4SDarek Stojaczyk		fi
102386ee572bSSeth Howell	fi
102486ee572bSSeth Howell}
102586ee572bSSeth Howell
102628f4299fSMarcin Dziegielewskifunction get_nvme_name_from_bdf {
102728f4299fSMarcin Dziegielewski	blkname=()
102828f4299fSMarcin Dziegielewski
102928f4299fSMarcin Dziegielewski	nvme_devs=$(lsblk -d --output NAME | grep "^nvme") || true
103028f4299fSMarcin Dziegielewski	if [ -z "$nvme_devs" ]; then
103128f4299fSMarcin Dziegielewski		return
103228f4299fSMarcin Dziegielewski	fi
103328f4299fSMarcin Dziegielewski	for dev in $nvme_devs; do
103428f4299fSMarcin Dziegielewski		link_name=$(readlink /sys/block/$dev/device/device) || true
103528f4299fSMarcin Dziegielewski		if [ -z "$link_name" ]; then
103628f4299fSMarcin Dziegielewski			link_name=$(readlink /sys/block/$dev/device)
103728f4299fSMarcin Dziegielewski		fi
103828f4299fSMarcin Dziegielewski		bdf=$(basename "$link_name")
103928f4299fSMarcin Dziegielewski		if [ "$bdf" = "$1" ]; then
104028f4299fSMarcin Dziegielewski			blkname+=($dev)
104128f4299fSMarcin Dziegielewski		fi
104228f4299fSMarcin Dziegielewski	done
104328f4299fSMarcin Dziegielewski
104428f4299fSMarcin Dziegielewski	printf '%s\n' "${blkname[@]}"
104528f4299fSMarcin Dziegielewski}
104628f4299fSMarcin Dziegielewski
10472176f081SChunyang Huifunction opal_revert_cleanup {
10482176f081SChunyang Hui	$rootdir/app/spdk_tgt/spdk_tgt &
10492176f081SChunyang Hui	spdk_tgt_pid=$!
10502176f081SChunyang Hui	waitforlisten $spdk_tgt_pid
10512176f081SChunyang Hui
10522176f081SChunyang Hui	# OPAL test only runs on the first NVMe device
10532176f081SChunyang Hui	# So we just revert the first one here
10542176f081SChunyang Hui	bdf=$($rootdir/scripts/gen_nvme.sh --json | jq -r '.config[].params | select(.name=="Nvme0").traddr')
10552176f081SChunyang Hui	$rootdir/scripts/rpc.py bdev_nvme_attach_controller -b "nvme0" -t "pcie" -a $bdf
10561a903f9cSBen Walker	# Ignore if this fails.
10571a903f9cSBen Walker	$rootdir/scripts/rpc.py bdev_nvme_opal_revert -b nvme0 -p test || true
10582176f081SChunyang Hui
10592176f081SChunyang Hui	killprocess $spdk_tgt_pid
10602176f081SChunyang Hui}
10612176f081SChunyang Hui
1062c9e5d2a6SSeth Howellset -o errtrace
1063c9e5d2a6SSeth Howelltrap "trap - ERR; print_backtrace >&2" ERR
10647612ac47SDarek Stojaczyk
10657612ac47SDarek StojaczykPS4=' \t	\$ '
10667612ac47SDarek Stojaczykif $SPDK_AUTOTEST_X; then
106739fe5c84SSeth Howell	# explicitly enable xtraces, overriding any tracking information.
106839fe5c84SSeth Howell	unset XTRACE_DISABLED
106939fe5c84SSeth Howell	unset XTRACE_NESTING_LEVEL
10707612ac47SDarek Stojaczyk	set -x
10717612ac47SDarek Stojaczyk	xtrace_enable
10727612ac47SDarek Stojaczykelse
10737612ac47SDarek Stojaczyk	xtrace_restore
10747612ac47SDarek Stojaczykfi
1075