Spdk/test/nvme/hw_hotplug.sh
Krzysztof Karas ce29e0131f hotplug: use RPC instead of reading hotplug logs
A new RPC perform_tests has been added.
This request will help us avoid reading hotplug generated
logs, and instead we can stop hotplug right before
it begins generating IO, and resume it when the test
scripts are ready.

Additionally a new command line option has been added
to the hotplug application "--wait-for-rpc", which
indicates that hotplug should wait for
perform_tests RPC before starting its IO.

Change-Id: I71ca148201854ac155cc2a61171a4fb5fc427a19
Signed-off-by: Krzysztof Karas <krzysztof.karas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13962
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
2022-09-23 12:54:44 +00:00

108 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
shopt -s nullglob
testdir=$(readlink -f $(dirname $0))
rootdir=$(readlink -f $testdir/../..)
source $rootdir/test/common/autotest_common.sh
export PYTHONPATH="$rootdir/examples/nvme/hotplug/"
rpc_py=$rootdir/scripts/rpc.py
function beetle_ssh() {
ssh_opts="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"
if [[ -n $BEETLE_SSH_KEY ]]; then
ssh_opts+=" -i $(readlink -f $BEETLE_SSH_KEY)"
fi
#shellcheck disable=SC2029
ssh $ssh_opts root@$ip "$@"
}
function insert_device() {
beetle_ssh 'for gpio in {0..10}; do Beetle --SetGpio "$gpio" HIGH; done'
for name in "${names[@]}"; do
waitforblk $name
done
DRIVER_OVERRIDE=$driver $rootdir/scripts/setup.sh
}
function remove_device() {
beetle_ssh 'for gpio in {0..10}; do Beetle --SetGpio "$gpio" LOW; done'
}
function restore_device() {
beetle_ssh 'for gpio in {0..10}; do Beetle --SetGpio "$gpio" HIGH; done'
# Bind all devices to kernel
"$rootdir/scripts/setup.sh" reset
}
ip=$1
driver=$2
declare -i io_time=5
declare -i kernel_hotplug_time=7
timing_enter hotplug_hw_cfg
# Configure microcontroller
beetle_ssh 'for gpio in {0..10}; do Beetle --SetGpioDirection "$gpio" OUT; done'
# Get blk dev names connected to interposer
restore_device
sleep $kernel_hotplug_time
blk_list1=$(lsblk -d --output NAME | grep "^nvme")
remove_device
sleep $kernel_hotplug_time
blk_list2=$(lsblk -d --output NAME | grep "^nvme") || true
names=(${blk_list1#"$blk_list2"})
nvme_count="${#names[@]}"
echo nvme_count
# Move devices back to userspace
insert_device
timing_exit hotplug_hw_cfg
timing_enter hotplug_hw_test
mode=""
if [ "$driver" = "uio_pci_generic" ]; then
mode="-m pa"
fi
"$SPDK_EXAMPLE_DIR/hotplug" -i 0 -t 100 -n $((2 * nvme_count)) -r $((2 * nvme_count)) \
$mode --wait-for-rpc &
hotplug_pid=$!
trap 'killprocess $hotplug_pid; restore_device; exit 1' SIGINT SIGTERM EXIT
waitforlisten $hotplug_pid
$rpc_py --plugin hotplug_plugin perform_tests
# Add and remove NVMe with delays between to give some time for IO to proceed
remove_device
sleep $io_time
insert_device
sleep $io_time
remove_device
sleep $io_time
insert_device
sleep $io_time
timing_enter wait_for_example
if ! wait $hotplug_pid; then
echo "Hotplug example returned error!"
exit 1
fi
timing_exit wait_for_example
trap - SIGINT SIGTERM EXIT
restore_device
timing_exit hotplug_hw_test