1eb53c232Spaul luse# SPDX-License-Identifier: BSD-3-Clause 2eb53c232Spaul luse# Copyright (C) 2018 Intel Corporation 3eb53c232Spaul luse# All rights reserved. 4eb53c232Spaul luse# 5eb53c232Spaul luse 6e422bf69SBen Walkersource $rootdir/test/nvmf/common.sh 76ebfbf73SPawel Wodkowski 8844c8ec3SMichal Bergerfunction migration_tc2_cleanup_nvmf_tgt() { 9c5cba2c1SMichal Berger process_shm --id $NVMF_APP_SHM_ID 10c5cba2c1SMichal Berger nvmftestfini 116ebfbf73SPawel Wodkowski} 126ebfbf73SPawel Wodkowski 13844c8ec3SMichal Bergerfunction migration_tc2_cleanup_vhost_config() { 146ebfbf73SPawel Wodkowski timing_enter migration_tc2_cleanup_vhost_config 156ebfbf73SPawel Wodkowski 166ebfbf73SPawel Wodkowski notice "Shutting down all VMs" 176ebfbf73SPawel Wodkowski vm_shutdown_all 186ebfbf73SPawel Wodkowski 196ebfbf73SPawel Wodkowski notice "Removing vhost devices & controllers via RPC ..." 206ebfbf73SPawel Wodkowski # Delete bdev first to remove all LUNs and SCSI targets 2131e77a73SPawel Kaminski $rpc_0 bdev_nvme_detach_controller Nvme0 22edb18971SPawel Kaminski $rpc_0 vhost_delete_controller $incoming_vm_ctrlr 236ebfbf73SPawel Wodkowski 247aa92ad5Swanghailiangx $rpc_1 bdev_nvme_detach_controller Nvme0 25edb18971SPawel Kaminski $rpc_1 vhost_delete_controller $target_vm_ctrlr 266ebfbf73SPawel Wodkowski 276ebfbf73SPawel Wodkowski notice "killing vhost app" 28bfdb9403SBen Walker vhost_kill 0 29bfdb9403SBen Walker vhost_kill 1 306ebfbf73SPawel Wodkowski 316ebfbf73SPawel Wodkowski unset -v incoming_vm target_vm incoming_vm_ctrlr target_vm_ctrlr 326ebfbf73SPawel Wodkowski unset -v rpc_0 rpc_1 336ebfbf73SPawel Wodkowski 346ebfbf73SPawel Wodkowski migration_tc2_cleanup_nvmf_tgt 356ebfbf73SPawel Wodkowski 366ebfbf73SPawel Wodkowski timing_exit migration_tc2_cleanup_vhost_config 376ebfbf73SPawel Wodkowski} 386ebfbf73SPawel Wodkowski 39844c8ec3SMichal Bergerfunction migration_tc2_configure_vhost() { 406ebfbf73SPawel Wodkowski timing_enter migration_tc2_configure_vhost 416ebfbf73SPawel Wodkowski 42fcb773a3SMichal Berger TEST_TRANSPORT=${TEST_TRANSPORT:-tcp} 43fcb773a3SMichal Berger NET_TYPE=${NET_TYPE:-phy-fallback} \ 44fcb773a3SMichal Berger TEST_MODE=iso nvmftestinit 45c5cba2c1SMichal Berger 466abdfcd2SChen Wang # Those are global intentionally - they will be unset in cleanup handler 476ebfbf73SPawel Wodkowski 486ebfbf73SPawel Wodkowski incoming_vm=1 496ebfbf73SPawel Wodkowski target_vm=2 506ebfbf73SPawel Wodkowski incoming_vm_ctrlr=naa.VhostScsi0.$incoming_vm 516ebfbf73SPawel Wodkowski target_vm_ctrlr=naa.VhostScsi0.$target_vm 526ebfbf73SPawel Wodkowski 53e422bf69SBen Walker rpc_0="$rootdir/scripts/rpc.py -s $(get_vhost_dir 0)/rpc.sock" 54e422bf69SBen Walker rpc_1="$rootdir/scripts/rpc.py -s $(get_vhost_dir 1)/rpc.sock" 556ebfbf73SPawel Wodkowski 566ebfbf73SPawel Wodkowski # Run nvmf_tgt and two vhost instances: 576ebfbf73SPawel Wodkowski # nvmf_tgt uses core id 2 (-m 0x4) 58cefe9145SBen Walker # First uses core id 0 59cefe9145SBen Walker # Second uses core id 1 606ebfbf73SPawel Wodkowski # This force to use VM 1 and 2. 616ebfbf73SPawel Wodkowski timing_enter start_nvmf_tgt 626ebfbf73SPawel Wodkowski notice "Running nvmf_tgt..." 63c5cba2c1SMichal Berger nvmfappstart -s 512 -m 0x4 --wait-for-rpc 64c5cba2c1SMichal Berger # Override the trap set in place via nvmfappstart() 65c5cba2c1SMichal Berger trap 'migration_tc2_error_cleanup; error_exit "${FUNCNAME}" "${LINENO}"' INT ERR EXIT 66c5cba2c1SMichal Berger rpc_cmd framework_start_init 67c9e23c2bSMichal Berger rpc_cmd nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192 68c5cba2c1SMichal Berger mapfile -t json < <("$rootdir/scripts/gen_nvme.sh") 69c5cba2c1SMichal Berger rpc_cmd load_subsystem_config -j "'${json[*]}'" 706ebfbf73SPawel Wodkowski timing_exit start_nvmf_tgt 716ebfbf73SPawel Wodkowski 72*4641aa53SMichal Berger vhost_run -n 0 -- -m 0x1 -s 512 -u 73*4641aa53SMichal Berger vhost_run -n 1 -- -m 0x2 -s 512 -u 746ebfbf73SPawel Wodkowski 75fcb773a3SMichal Berger local nvmf_target_ip=$NVMF_FIRST_TARGET_IP 766ebfbf73SPawel Wodkowski 776ebfbf73SPawel Wodkowski if [[ -z "$nvmf_target_ip" ]]; then 786ebfbf73SPawel Wodkowski fail "no NIC for nvmf target" 796ebfbf73SPawel Wodkowski fi 806ebfbf73SPawel Wodkowski 816ebfbf73SPawel Wodkowski notice "Configuring nvmf_tgt, vhost devices & controllers via RPC ..." 826ebfbf73SPawel Wodkowski 836ebfbf73SPawel Wodkowski # Construct shared bdevs and controllers 84c5cba2c1SMichal Berger rpc_cmd nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 85c5cba2c1SMichal Berger rpc_cmd nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Nvme0n1 86fcb773a3SMichal Berger rpc_cmd nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t "$TEST_TRANSPORT" -a $nvmf_target_ip -s 4420 876ebfbf73SPawel Wodkowski 88fcb773a3SMichal Berger $rpc_0 bdev_nvme_attach_controller -b Nvme0 -t "$TEST_TRANSPORT" -f ipv4 -a $nvmf_target_ip -s 4420 -n "nqn.2016-06.io.spdk:cnode1" 89c7e05d83SPawel Kaminski $rpc_0 vhost_create_scsi_controller $incoming_vm_ctrlr 90d4245df9SPawel Kaminski $rpc_0 vhost_scsi_controller_add_target $incoming_vm_ctrlr 0 Nvme0n1 916ebfbf73SPawel Wodkowski 92fcb773a3SMichal Berger $rpc_1 bdev_nvme_attach_controller -b Nvme0 -t "$TEST_TRANSPORT" -f ipv4 -a $nvmf_target_ip -s 4420 -n "nqn.2016-06.io.spdk:cnode1" 93c7e05d83SPawel Kaminski $rpc_1 vhost_create_scsi_controller $target_vm_ctrlr 94d4245df9SPawel Kaminski $rpc_1 vhost_scsi_controller_add_target $target_vm_ctrlr 0 Nvme0n1 956ebfbf73SPawel Wodkowski 966ebfbf73SPawel Wodkowski notice "Setting up VMs" 976ebfbf73SPawel Wodkowski vm_setup --os="$os_image" --force=$incoming_vm --disk-type=spdk_vhost_scsi --disks=VhostScsi0 \ 98fa563858SBen Walker --migrate-to=$target_vm --memory=1024 --vhost-name=0 996ebfbf73SPawel Wodkowski vm_setup --force=$target_vm --disk-type=spdk_vhost_scsi --disks=VhostScsi0 --incoming=$incoming_vm --memory=1024 \ 100fa563858SBen Walker --vhost-name=1 1016ebfbf73SPawel Wodkowski 1026ebfbf73SPawel Wodkowski # Run everything 1036ebfbf73SPawel Wodkowski vm_run $incoming_vm $target_vm 1046ebfbf73SPawel Wodkowski 1056ebfbf73SPawel Wodkowski # Wait only for incoming VM, as target is waiting for migration 1068228a208SPawel Kaminski vm_wait_for_boot 300 $incoming_vm 1076ebfbf73SPawel Wodkowski 1086ebfbf73SPawel Wodkowski notice "Configuration done" 1096ebfbf73SPawel Wodkowski 1106ebfbf73SPawel Wodkowski timing_exit migration_tc2_configure_vhost 1116ebfbf73SPawel Wodkowski} 1126ebfbf73SPawel Wodkowski 113844c8ec3SMichal Bergerfunction migration_tc2_error_cleanup() { 1146ebfbf73SPawel Wodkowski vm_kill_all 115c5cba2c1SMichal Berger migration_tc2_cleanup_nvmf_tgt 1166ebfbf73SPawel Wodkowski migration_tc2_cleanup_vhost_config 1176ebfbf73SPawel Wodkowski notice "Migration TC2 FAILED" 1186ebfbf73SPawel Wodkowski} 1196ebfbf73SPawel Wodkowski 120844c8ec3SMichal Bergerfunction migration_tc2() { 1216ebfbf73SPawel Wodkowski # Use 2 VMs: 1226ebfbf73SPawel Wodkowski # incoming VM - the one we want to migrate 1236ebfbf73SPawel Wodkowski # targe VM - the one which will accept migration 124d6db5988SChangpeng Liu # VM uses 1 GiB memory, here we use light IO workload to keep number of dirty pages 125d6db5988SChangpeng Liu # is in low rate of VM's memory, see https://github.com/spdk/spdk/issues/2805. 1267729225fSGangCao local job_file="$testdir/migration-tc2.job" 12701425928SKarol Latecki local log_file 12801425928SKarol Latecki log_file="/root/$(basename ${job_file%%.*}).log" 1296ebfbf73SPawel Wodkowski 1306ebfbf73SPawel Wodkowski migration_tc2_configure_vhost 1316ebfbf73SPawel Wodkowski 1326ebfbf73SPawel Wodkowski # Run fio before migration 1336ebfbf73SPawel Wodkowski notice "Starting FIO" 1346ebfbf73SPawel Wodkowski vm_check_scsi_location $incoming_vm 13501425928SKarol Latecki run_fio $fio_bin --job-file="$job_file" --no-wait-for-fio --local --vm="${incoming_vm}$(printf ':/dev/%s' $SCSI_DISK)" 1366ebfbf73SPawel Wodkowski 1376ebfbf73SPawel Wodkowski # Wait a while to let the FIO time to issue some IO 1386ebfbf73SPawel Wodkowski sleep 5 1396ebfbf73SPawel Wodkowski 1406ebfbf73SPawel Wodkowski # Check if fio is still running before migration 1416ebfbf73SPawel Wodkowski if ! is_fio_running $incoming_vm; then 14201425928SKarol Latecki vm_exec $incoming_vm "cat $log_file" 1436ebfbf73SPawel Wodkowski error "FIO is not running before migration: process crashed or finished too early" 1446ebfbf73SPawel Wodkowski fi 1456ebfbf73SPawel Wodkowski 1466ebfbf73SPawel Wodkowski vm_migrate $incoming_vm 1476ebfbf73SPawel Wodkowski sleep 3 1486ebfbf73SPawel Wodkowski 1496ebfbf73SPawel Wodkowski # Check if fio is still running after migration 1506ebfbf73SPawel Wodkowski if ! is_fio_running $target_vm; then 15101425928SKarol Latecki vm_exec $target_vm "cat $log_file" 1526ebfbf73SPawel Wodkowski error "FIO is not running after migration: process crashed or finished too early" 1536ebfbf73SPawel Wodkowski fi 1546ebfbf73SPawel Wodkowski 1556ebfbf73SPawel Wodkowski notice "Waiting for fio to finish" 156bfdb9de3SMichal Berger local timeout=20 1576ebfbf73SPawel Wodkowski while is_fio_running $target_vm; do 1586ebfbf73SPawel Wodkowski sleep 1 1596ebfbf73SPawel Wodkowski echo -n "." 1606ebfbf73SPawel Wodkowski if ((timeout-- == 0)); then 1616ebfbf73SPawel Wodkowski error "timeout while waiting for FIO!" 1626ebfbf73SPawel Wodkowski fi 1636ebfbf73SPawel Wodkowski done 1646ebfbf73SPawel Wodkowski 1656ebfbf73SPawel Wodkowski notice "Fio result is:" 16601425928SKarol Latecki vm_exec $target_vm "cat $log_file" 1676ebfbf73SPawel Wodkowski 1686ebfbf73SPawel Wodkowski migration_tc2_cleanup_vhost_config 1696ebfbf73SPawel Wodkowski notice "Migration TC2 SUCCESS" 1706ebfbf73SPawel Wodkowski} 171