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