test/bdev: MLX5 AES_XTS testing support

- MLX5 crypto device setup and run in blockdev.sh.
- Using "env_context" FIO config field to run FIO perf tests on MLX5
  device.
- Wait a bit longer for tgt to start since MLX5 allocates descriptors
  longer than the others.

Signed-off-by: Yuriy Umanets <yumanets@nvidia.com>
Change-Id: I282872cf86528283a3a59e0a787ff516181d534e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11634
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Yuriy Umanets 2022-01-21 14:58:06 +02:00 committed by Tomasz Zawadzki
parent 9af7c30e8f
commit 872e0e4690
2 changed files with 85 additions and 17 deletions

View File

@ -28,7 +28,7 @@ function cleanup() {
}
function start_spdk_tgt() {
"$SPDK_BIN_DIR/spdk_tgt" &
"$SPDK_BIN_DIR/spdk_tgt" "$env_ctx" &
spdk_tgt_pid=$!
trap 'killprocess "$spdk_tgt_pid"; exit 1' SIGINT SIGTERM EXIT
waitforlisten "$spdk_tgt_pid"
@ -119,6 +119,38 @@ function setup_crypto_qat_conf() {
RPC
}
function setup_crypto_mlx5_conf() {
local key=$1
local block_key
local tweak_key
if [ ${#key} == 96 ]; then
# 96 bytes is 64 + 32 - AES_XTS_256 in hexlified format
# Copy first 64 chars into the 'key'. This gives 32 in the
# binary or 256 bit.
block_key=${key:0:64}
# Copy the the rest of the key and pass it as the 'key2'.
tweak_key=${key:64:32}
elif [ ${#key} == 160 ]; then
# 160 bytes is 128 + 32 - AES_XTS_512 in hexlified format
# Copy first 128 chars into the 'key'. This gives 64 in the
# binary or 512 bit.
block_key=${key:0:128}
# Copy the the rest of the key and pass it as the 'key2'.
tweak_key=${key:128:32}
else
echo "ERROR: Invalid DEK size for MLX5 crypto setup: ${#key}"
echo "ERROR: Supported key sizes for MLX5: 96 bytes (AES_XTS_256) and 160 bytes (AES_XTS_512)."
return 1
fi
# Malloc0 will use MLX5 AES_XTS
"$rpc_py" <<- RPC
bdev_malloc_create -b Malloc0 16 512
bdev_crypto_create -c AES_XTS -k2 $tweak_key Malloc0 crypto_ram4 mlx5_pci $block_key
bdev_get_bdevs -b Malloc0
RPC
}
function setup_pmem_conf() {
if hash pmempool; then
rm -f "$SPDK_TEST_STORAGE/spdk-pmem-pool"
@ -138,7 +170,7 @@ function setup_rbd_conf() {
}
function bdev_bounds() {
$testdir/bdevio/bdevio -w -s $PRE_RESERVED_MEM --json "$conf_file" &
$testdir/bdevio/bdevio -w -s $PRE_RESERVED_MEM --json "$conf_file" "$env_ctx" &
bdevio_pid=$!
trap 'cleanup; killprocess $bdevio_pid; exit 1' SIGINT SIGTERM EXIT
echo "Process bdevio pid: $bdevio_pid"
@ -170,7 +202,7 @@ function nbd_function_test() {
fi
modprobe nbd
$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 --json "$conf" &
$rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 --json "$conf" "$env_ctx" &
nbd_pid=$!
trap 'cleanup; killprocess $nbd_pid; exit 1' SIGINT SIGTERM EXIT
echo "Process nbd pid: $nbd_pid"
@ -187,8 +219,16 @@ function nbd_function_test() {
}
function fio_test_suite() {
local env_context
# Make sure that state files and anything else produced by fio test will
# stay at the testdir.
pushd $testdir
trap 'rm -f ./*.state; popd; exit 1' SIGINT SIGTERM EXIT
# Generate the fio config file given the list of all unclaimed bdevs
fio_config_gen $testdir/bdev.fio verify AIO
env_context=$(echo "$env_ctx" | sed 's/--env-context=//')
fio_config_gen $testdir/bdev.fio verify AIO "$env_context"
for b in $(echo $bdevs | jq -r '.name'); do
echo "[job_$b]" >> $testdir/bdev.fio
echo "filename=$b" >> $testdir/bdev.fio
@ -197,12 +237,12 @@ function fio_test_suite() {
local fio_params="--ioengine=spdk_bdev --iodepth=8 --bs=4k --runtime=10 $testdir/bdev.fio --spdk_json_conf=$conf_file"
run_test "bdev_fio_rw_verify" fio_bdev $fio_params --spdk_mem=$PRE_RESERVED_MEM \
--output=$output_dir/blockdev_fio_verify.txt
--output=$output_dir/blockdev_fio_verify.txt --aux-path=$output_dir
rm -f ./*.state
rm -f $testdir/bdev.fio
# Generate the fio config file given the list of all unclaimed bdevs that support unmap
fio_config_gen $testdir/bdev.fio trim
fio_config_gen $testdir/bdev.fio trim "" "$env_context"
if [ "$(echo $bdevs | jq -r 'select(.supported_io_types.unmap == true) | .name')" != "" ]; then
for b in $(echo $bdevs | jq -r 'select(.supported_io_types.unmap == true) | .name'); do
echo "[job_$b]" >> $testdir/bdev.fio
@ -210,12 +250,16 @@ function fio_test_suite() {
done
else
rm -f $testdir/bdev.fio
popd
trap - SIGINT SIGTERM EXIT
return 0
fi
run_test "bdev_fio_trim" fio_bdev $fio_params --output=$output_dir/blockdev_trim.txt
run_test "bdev_fio_trim" fio_bdev $fio_params --output=$output_dir/blockdev_trim.txt --aux-path=$output_dir
rm -f ./*.state
rm -f $testdir/bdev.fio
popd
trap - SIGINT SIGTERM EXIT
}
function get_io_result() {
@ -289,7 +333,7 @@ function qos_function_test() {
function qos_test_suite() {
# Run bdevperf with QoS disabled first
"$testdir/bdevperf/bdevperf" -z -m 0x2 -q 256 -o 4096 -w randread -t 60 &
"$testdir/bdevperf/bdevperf" -z -m 0x2 -q 256 -o 4096 -w randread -t 60 "$env_ctx" &
QOS_PID=$!
echo "Process qos testing pid: $QOS_PID"
trap 'cleanup; killprocess $QOS_PID; exit 1' SIGINT SIGTERM EXIT
@ -324,6 +368,21 @@ else
fi
test_type=${1:-bdev}
crypto_device=$2
wcs_file=$3
dek=$4
env_ctx=""
if [ -n "$crypto_device" ] && [ -n "$wcs_file" ]; then
# We need full path here since fio perf test does 'pushd' to the test dir
# and crypto login of fio plugin test can fail.
wcs_file=$(readlink -f $wcs_file)
if [ -f $wcs_file ]; then
env_ctx="--env-context=--allow=$crypto_device,class=crypto,wcs_file=$wcs_file"
else
echo "ERROR: Credentials file $3 is not found!"
exit 1
fi
fi
start_spdk_tgt
case "$test_type" in
bdev)
@ -341,6 +400,9 @@ case "$test_type" in
crypto_qat)
setup_crypto_qat_conf
;;
crypto_mlx5)
setup_crypto_mlx5_conf $dek
;;
pmem)
setup_pmem_conf
;;
@ -373,15 +435,15 @@ killprocess "$spdk_tgt_pid"
trap "cleanup" SIGINT SIGTERM EXIT
run_test "bdev_hello_world" $SPDK_EXAMPLE_DIR/hello_bdev --json "$conf_file" -b "$hello_world_bdev"
run_test "bdev_bounds" bdev_bounds
run_test "bdev_nbd" nbd_function_test $conf_file "$bdevs_name"
run_test "bdev_hello_world" $SPDK_EXAMPLE_DIR/hello_bdev --json "$conf_file" -b "$hello_world_bdev" "$env_ctx"
run_test "bdev_bounds" bdev_bounds "$env_ctx"
run_test "bdev_nbd" nbd_function_test $conf_file "$bdevs_name" "$env_ctx"
if [[ $CONFIG_FIO_PLUGIN == y ]]; then
if [ "$test_type" = "nvme" ] || [ "$test_type" = "gpt" ]; then
# TODO: once we get real multi-ns drives, re-enable this test for NVMe.
echo "skipping fio tests on NVMe due to multi-ns failures."
else
run_test "bdev_fio" fio_test_suite
run_test "bdev_fio" fio_test_suite "$env_ctx"
fi
else
echo "FIO not available"
@ -390,16 +452,16 @@ fi
trap "cleanup" SIGINT SIGTERM EXIT
run_test "bdev_verify" $testdir/bdevperf/bdevperf --json "$conf_file" -q 128 -o 4096 -w verify -t 5 -C -m 0x3
run_test "bdev_write_zeroes" $testdir/bdevperf/bdevperf --json "$conf_file" -q 128 -o 4096 -w write_zeroes -t 1
run_test "bdev_verify" $testdir/bdevperf/bdevperf --json "$conf_file" -q 128 -o 4096 -w verify -t 5 -C -m 0x3 "$env_ctx"
run_test "bdev_write_zeroes" $testdir/bdevperf/bdevperf --json "$conf_file" -q 128 -o 4096 -w write_zeroes -t 1 "$env_ctx"
if [[ $test_type == bdev ]]; then
run_test "bdev_qos" qos_test_suite
run_test "bdev_qos" qos_test_suite "$env_ctx"
fi
# Temporarily disabled - infinite loop
# if [ $RUN_NIGHTLY -eq 1 ]; then
# run_test "bdev_reset" $testdir/bdevperf/bdevperf --json "$conf_file" -q 16 -w reset -o 4096 -t 60
# run_test "bdev_reset" $testdir/bdevperf/bdevperf --json "$conf_file" -q 16 -w reset -o 4096 -t 60 "$env_ctx"
# fi
# Bdev and configuration cleanup below this line

View File

@ -718,7 +718,7 @@ function waitforlisten() {
xtrace_disable
local ret=0
local i
for ((i = 40; i != 0; i--)); do
for ((i = 100; i != 0; i--)); do
# if the process is no longer running, then exit the script
# since it means the application crashed
if ! kill -s 0 $1; then
@ -1122,6 +1122,7 @@ function fio_config_gen() {
local config_file=$1
local workload=$2
local bdev_type=$3
local env_context=$4
local fio_dir=$CONFIG_FIO_SOURCE_DIR
if [ -e "$config_file" ]; then
@ -1133,11 +1134,16 @@ function fio_config_gen() {
workload=randrw
fi
if [ -n "$env_context" ]; then
env_context="env_context=$env_context"
fi
touch $1
cat > $1 << EOL
[global]
thread=1
$env_context
group_reporting=1
direct=1
norandommap=1