2020-06-15 14:14:28 +00:00
|
|
|
source "$rootdir/test/common/autotest_common.sh"
|
|
|
|
source "$rootdir/scripts/common.sh"
|
|
|
|
|
|
|
|
clear_nvme() {
|
|
|
|
local bdev=$1
|
|
|
|
local nvme_ref=$2
|
|
|
|
local size=${3:-0xffff}
|
|
|
|
|
|
|
|
local bs=$((1024 << 10)) # 1M
|
|
|
|
local count=$(((size / bs) + (size % bs ? 1 : 0)))
|
|
|
|
|
|
|
|
"${DD_APP[@]}" \
|
|
|
|
--if="/dev/zero" \
|
|
|
|
--bs="$bs" \
|
|
|
|
--ob="$bdev" \
|
|
|
|
--count="$count" \
|
|
|
|
--json <(gen_conf $nvme_ref)
|
|
|
|
}
|
|
|
|
|
|
|
|
trunc_files() {
|
|
|
|
local f
|
|
|
|
for f; do : > "$f"; done
|
|
|
|
}
|
|
|
|
|
|
|
|
gen_conf() {
|
|
|
|
xtrace_disable
|
|
|
|
|
|
|
|
local ref_name
|
|
|
|
local method methods
|
|
|
|
local param params
|
|
|
|
local config
|
|
|
|
|
|
|
|
# Pick references to all assoc arrays and build subsystem's config
|
|
|
|
# around them. The assoc array should be the name of the rpc method
|
|
|
|
# suffixed with unique _ID (ID may be any string). Default arrays
|
|
|
|
# should be prefixed with _method string. The keys of the array
|
|
|
|
# should store names of the method's parameters - proper quoting
|
|
|
|
# of the values is done here. extra_subsystems[] can store extra
|
|
|
|
# json configuration for different subsystems, other than bdev.
|
|
|
|
|
2021-10-20 10:38:19 +00:00
|
|
|
if (($# == 0)) && [[ -z ${!method_@} ]]; then
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
2020-06-15 14:14:28 +00:00
|
|
|
methods=("${@:-${!method_@}}")
|
|
|
|
local IFS=","
|
|
|
|
|
|
|
|
for ref_name in "${methods[@]}"; do
|
|
|
|
method=${ref_name#*method_} method=${method%_*} params=()
|
|
|
|
|
|
|
|
# FIXME: centos7's Bash got trapped in 2011:
|
|
|
|
# local -n ref=$ref_name -> local: -n: invalid option
|
|
|
|
# HACK: it with eval and partial refs instead.
|
|
|
|
eval "local refs=(\${!${ref_name}[@]})"
|
|
|
|
local param_ref
|
|
|
|
|
|
|
|
for param in "${refs[@]}"; do
|
|
|
|
param_ref="${ref_name}[$param]"
|
|
|
|
if [[ ${!param_ref} =~ ^([0-9]+|true|false|\{.*\})$ ]]; then
|
|
|
|
params+=("\"$param\": ${!param_ref}")
|
|
|
|
else
|
|
|
|
params+=("\"$param\": \"${!param_ref}\"")
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
config+=("$(
|
|
|
|
cat <<- JSON
|
|
|
|
{
|
|
|
|
"params": {
|
|
|
|
${params[*]}
|
|
|
|
},
|
|
|
|
"method": "$method"
|
|
|
|
}
|
|
|
|
JSON
|
|
|
|
)")
|
|
|
|
done
|
|
|
|
|
|
|
|
jq . <<- JSON | tee /dev/stderr
|
|
|
|
{
|
|
|
|
"subsystems": [
|
|
|
|
{
|
|
|
|
"subsystem": "bdev",
|
|
|
|
"config": [
|
2021-05-12 11:49:53 +00:00
|
|
|
${config[*]},
|
|
|
|
{
|
|
|
|
"method": "bdev_wait_for_examine"
|
|
|
|
}
|
2020-06-15 14:14:28 +00:00
|
|
|
]
|
|
|
|
}
|
|
|
|
${extra_subsystems[*]:+,${extra_subsystems[*]}}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
JSON
|
|
|
|
|
|
|
|
xtrace_restore
|
|
|
|
}
|
|
|
|
|
|
|
|
gen_bytes() {
|
|
|
|
xtrace_disable
|
|
|
|
|
|
|
|
local max=$1
|
|
|
|
local bytes
|
|
|
|
local byte
|
|
|
|
local string
|
|
|
|
shift
|
|
|
|
|
|
|
|
bytes=({a..z} {0..9})
|
|
|
|
if (($#)); then
|
|
|
|
bytes=("$@")
|
|
|
|
fi
|
|
|
|
|
|
|
|
for ((byte = 0; byte < max; byte++)); do
|
|
|
|
string+=${bytes[RANDOM % ${#bytes[@]}]}
|
|
|
|
done
|
|
|
|
printf '%b' "$string"
|
|
|
|
|
|
|
|
xtrace_restore
|
|
|
|
}
|
|
|
|
|
|
|
|
get_native_nvme_bs() {
|
|
|
|
# This is now needed since spdk_dd will reject all bs smaller than the
|
|
|
|
# native bs of given nvme. We need to make sure all tests are using
|
|
|
|
# bs >= native_bs. Use identify here so we don't have to switch nvmes
|
|
|
|
# between user space and the kernel back and forth.
|
|
|
|
local pci=$1 lbaf id
|
|
|
|
|
|
|
|
mapfile -t id < <("$rootdir/build/examples/identify" -r trtype:pcie "traddr:$pci")
|
|
|
|
|
|
|
|
# Get size of the current LBAF
|
|
|
|
[[ ${id[*]} =~ "Current LBA Format:"\ *"LBA Format #"([0-9]+) ]]
|
|
|
|
lbaf=${BASH_REMATCH[1]}
|
|
|
|
[[ ${id[*]} =~ "LBA Format #$lbaf: Data Size:"\ *([0-9]+) ]]
|
|
|
|
lbaf=${BASH_REMATCH[1]}
|
|
|
|
|
|
|
|
echo "$lbaf"
|
|
|
|
}
|
2020-07-14 08:40:36 +00:00
|
|
|
|
|
|
|
check_liburing() {
|
|
|
|
# Simply check if spdk_dd links to liburing. If yes, log that information.
|
|
|
|
local lib so
|
|
|
|
local -g liburing_in_use=0
|
|
|
|
|
|
|
|
while read -r lib _ so _; do
|
|
|
|
if [[ $lib == liburing.so.* ]]; then
|
|
|
|
printf '* spdk_dd linked to liburing\n'
|
|
|
|
# For sanity, check build config to see if liburing was requested.
|
|
|
|
if [[ -e $rootdir/test/common/build_config.sh ]]; then
|
|
|
|
source "$rootdir/test/common/build_config.sh"
|
|
|
|
fi
|
|
|
|
if [[ $CONFIG_URING != y ]]; then
|
|
|
|
printf '* spdk_dd built with liburing, but no liburing support requested?\n'
|
|
|
|
fi
|
|
|
|
if [[ ! -e $so ]]; then
|
|
|
|
printf '* %s is missing, aborting\n' "$lib"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
export liburing_in_use=1
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
done < <(LD_TRACE_LOADED_OBJECTS=1 "${DD_APP[@]}") >&2
|
|
|
|
}
|