1#!/usr/bin/env bash 2 3set -e 4 5testdir=$(readlink -f $(dirname $0)) 6rootdir=$(readlink -f $testdir/../..) 7plugindir=$rootdir/examples/bdev/fio_plugin 8source "$rootdir/scripts/common.sh" 9source "$rootdir/test/common/autotest_common.sh" 10source "$rootdir/test/nvmf/common.sh" 11 12# Declare rpc_py here, because its default value points to rpc_cmd function, 13# which does not tolerate piping arguments into it. 14rpc_py="$rootdir/scripts/rpc.py" 15 16function error_cleanup() { 17 # force delete pmem file and wipe on-disk metadata 18 rm -rf /tmp/pmem 19 $SPDK_EXAMPLE_DIR/perf -q 1 -o 131072 -w write -t 2 20} 21 22function destroy_vols() { 23 # Gracefully destroy the vols via bdev_compress_delete API. 24 # bdev_compress_delete will delete the on-disk metadata as well as 25 # the persistent memory file containing its metadata. 26 $rpc_py bdev_compress_delete COMP_lvs0/lv0 27 $rpc_py bdev_lvol_delete_lvstore -l lvs0 28} 29 30function create_vols() { 31 $rootdir/scripts/gen_nvme.sh | $rpc_py load_subsystem_config 32 waitforbdev Nvme0n1 33 34 $rpc_py bdev_lvol_create_lvstore Nvme0n1 lvs0 35 $rpc_py bdev_lvol_create -t -l lvs0 lv0 100 36 waitforbdev lvs0/lv0 37 38 $rpc_py bdev_compress_set_pmd -p "$pmd" 39 if [ -z "$1" ]; then 40 $rpc_py bdev_compress_create -b lvs0/lv0 -p /tmp/pmem 41 else 42 $rpc_py bdev_compress_create -b lvs0/lv0 -p /tmp/pmem -l $1 43 fi 44 waitforbdev COMP_lvs0/lv0 45} 46 47function run_bdevio() { 48 $rootdir/test/bdev/bdevio/bdevio -w & 49 bdevio_pid=$! 50 trap 'killprocess $bdevio_pid; error_cleanup; exit 1' SIGINT SIGTERM EXIT 51 waitforlisten $bdevio_pid 52 create_vols 53 $rootdir/test/bdev/bdevio/tests.py perform_tests 54 destroy_vols 55 trap - SIGINT SIGTERM EXIT 56 killprocess $bdevio_pid 57} 58 59function run_bdevperf() { 60 $rootdir/test/bdev/bdevperf/bdevperf -z -q $1 -o $2 -w verify -t $3 -C -m 0x6 & 61 bdevperf_pid=$! 62 trap 'killprocess $bdevperf_pid; error_cleanup; exit 1' SIGINT SIGTERM EXIT 63 waitforlisten $bdevperf_pid 64 create_vols $4 65 $rootdir/test/bdev/bdevperf/bdevperf.py perform_tests 66 destroy_vols 67 trap - SIGINT SIGTERM EXIT 68 killprocess $bdevperf_pid 69} 70 71test_type=$1 72case "$test_type" in 73 qat) 74 pmd=1 75 ;; 76 isal) 77 pmd=2 78 ;; 79 *) 80 echo "invalid pmd name" 81 exit 1 82 ;; 83esac 84 85mkdir -p /tmp/pmem 86 87# per patch bdevperf uses slightly different params than nightly 88# logical block size same as underlying device, then 512 then 4096 89run_bdevperf 32 4096 3 90run_bdevperf 32 4096 3 512 91run_bdevperf 32 4096 3 4096 92run_bdevio 93 94if [ $RUN_NIGHTLY -eq 1 ]; then 95 run_bdevperf 64 16384 30 96 97 # run perf on nvmf target w/compressed vols 98 export TEST_TRANSPORT=tcp && nvmftestinit 99 nvmfappstart -m 0x7 100 trap "nvmftestfini; error_cleanup; exit 1" SIGINT SIGTERM EXIT 101 102 # Create an NVMe-oF subsystem and add compress bdevs as namespaces 103 $rpc_py nvmf_create_transport -t $TEST_TRANSPORT -u 8192 104 create_vols 105 $rpc_py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode0 -a -s SPDK0 106 $rpc_py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode0 COMP_lvs0/lv0 107 $rpc_py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode0 -t $TEST_TRANSPORT -a $NVMF_FIRST_TARGET_IP -s $NVMF_PORT 108 109 # Start random read writes in the background 110 $SPDK_EXAMPLE_DIR/perf -r "trtype:$TEST_TRANSPORT adrfam:IPv4 traddr:$NVMF_FIRST_TARGET_IP trsvcid:$NVMF_PORT" -o 4096 -q 64 -s 512 -w randrw -t 30 -c 0x18 -M 50 & 111 perf_pid=$! 112 113 # Wait for I/O to complete 114 trap 'killprocess $perf_pid; compress_err_cleanup; exit 1' SIGINT SIGTERM EXIT 115 wait $perf_pid 116 destroy_vols 117 118 trap - SIGINT SIGTERM EXIT 119 nvmftestfini 120fi 121 122rm -rf /tmp/pmem 123