1#!/usr/bin/env bash 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright (C) 2017 Intel Corporation 4# All rights reserved. 5# 6testdir=$(readlink -f $(dirname $0)) 7rootdir=$(readlink -f $testdir/../../..) 8source $rootdir/test/common/autotest_common.sh 9 10function run_spdk_fio() { 11 fio_bdev --ioengine=spdk_bdev "$@" --spdk_mem=1024 --spdk_single_seg=1 \ 12 --verify_state_save=0 13} 14 15function err_cleanup() { 16 rm -f $testdir/bdev.json 17 killprocess $vhost_pid 18 if [[ -n "$dummy_spdk_pid" ]] && kill -0 $dummy_spdk_pid &> /dev/null; then 19 killprocess $dummy_spdk_pid 20 fi 21} 22 23# start vhost and configure it 24trap 'err_cleanup; exit 1' SIGINT SIGTERM EXIT 25$SPDK_BIN_DIR/vhost -m 0xe & 26vhost_pid=$! 27waitforlisten $vhost_pid 28 29$rootdir/scripts/gen_nvme.sh | $rootdir/scripts/rpc.py load_subsystem_config 30if [ -z "$(rpc_cmd bdev_get_bdevs | jq '.[] | select(.name=="Nvme0n1")')" ]; then 31 echo "Nvme0n1 bdev not found!" && false 32fi 33 34rpc_cmd bdev_split_create Nvme0n1 6 35 36rpc_cmd vhost_create_scsi_controller naa.Nvme0n1_scsi0.0 37rpc_cmd vhost_scsi_controller_add_target naa.Nvme0n1_scsi0.0 0 Nvme0n1p0 38rpc_cmd vhost_scsi_controller_add_target naa.Nvme0n1_scsi0.0 1 Nvme0n1p1 39rpc_cmd vhost_scsi_controller_add_target naa.Nvme0n1_scsi0.0 2 Nvme0n1p2 40rpc_cmd vhost_scsi_controller_add_target naa.Nvme0n1_scsi0.0 3 Nvme0n1p3 41[[ "$(rpc_cmd vhost_get_controllers -n naa.Nvme0n1_scsi0.0 | jq -r '.[].cpumask')" == "0xe" ]] 42 43rpc_cmd vhost_create_blk_controller naa.Nvme0n1_blk0.0 Nvme0n1p4 --cpumask 0xe 44[[ "$(rpc_cmd vhost_get_controllers -n naa.Nvme0n1_blk0.0 | jq -r '.[].cpumask')" == "0xe" ]] 45rpc_cmd vhost_create_blk_controller naa.Nvme0n1_blk1.0 Nvme0n1p5 --cpumask 0x4 46[[ "$(rpc_cmd vhost_get_controllers -n naa.Nvme0n1_blk1.0 | jq -r '.[].cpumask')" == "0x4" ]] 47 48rpc_cmd bdev_malloc_create 128 512 --name Malloc0 49rpc_cmd vhost_create_scsi_controller naa.Malloc0.0 --cpumask 0x2 50rpc_cmd vhost_scsi_controller_add_target naa.Malloc0.0 0 Malloc0 51[[ "$(rpc_cmd vhost_get_controllers -n naa.Malloc0.0 | jq -r '.[].cpumask')" == "0x2" ]] 52 53rpc_cmd bdev_malloc_create 128 4096 --name Malloc1 54rpc_cmd vhost_create_scsi_controller naa.Malloc1.0 --cpumask 0xc 55rpc_cmd vhost_scsi_controller_add_target naa.Malloc1.0 0 Malloc1 56[[ "$(rpc_cmd vhost_get_controllers -n naa.Malloc1.0 | jq -r '.[].cpumask')" == "0xc" ]] 57 58# start a dummy app, create vhost bdevs in it, then dump the config for FIO 59# Pre-allocate 2GB of memory for the application - virtio-user initiator requires it. See issue #2596. 60$SPDK_BIN_DIR/spdk_tgt -r /tmp/spdk2.sock -g -s 2048 -m 0x1 & 61dummy_spdk_pid=$! 62waitforlisten $dummy_spdk_pid /tmp/spdk2.sock 63rpc_cmd -s /tmp/spdk2.sock bdev_virtio_attach_controller --trtype user --traddr 'naa.Nvme0n1_scsi0.0' -d scsi --vq-count 8 'VirtioScsi0' 64rpc_cmd -s /tmp/spdk2.sock bdev_virtio_attach_controller --trtype user --traddr 'naa.Nvme0n1_blk0.0' -d blk --vq-count 8 'VirtioBlk3' 65rpc_cmd -s /tmp/spdk2.sock bdev_virtio_attach_controller --trtype user --traddr 'naa.Nvme0n1_blk1.0' -d blk --vq-count 8 'VirtioBlk4' 66 67rpc_cmd -s /tmp/spdk2.sock bdev_virtio_attach_controller --trtype user --traddr 'naa.Malloc0.0' -d scsi --vq-count 8 'VirtioScsi1' 68rpc_cmd -s /tmp/spdk2.sock bdev_virtio_attach_controller --trtype user --traddr 'naa.Malloc1.0' -d scsi --vq-count 8 'VirtioScsi2' 69 70cat <<- CONF > $testdir/bdev.json 71 {"subsystems":[ 72 $(rpc_cmd -s /tmp/spdk2.sock save_subsystem_config -n bdev) 73 ]} 74CONF 75killprocess $dummy_spdk_pid 76 77# run FIO with previously acquired spdk config files 78timing_enter run_spdk_fio 79run_spdk_fio $testdir/bdev.fio --filename=* --section=job_randwrite --spdk_json_conf=$testdir/bdev.json 80timing_exit run_spdk_fio 81 82timing_enter run_spdk_fio_unmap 83run_spdk_fio $testdir/bdev.fio --filename="VirtioScsi1t0:VirtioScsi2t0" --spdk_json_conf=$testdir/bdev.json 84timing_exit run_spdk_fio_unmap 85 86rpc_cmd bdev_nvme_detach_controller Nvme0 87 88trap - SIGINT SIGTERM EXIT 89rm -f $testdir/bdev.json 90 91killprocess $vhost_pid 92