summaryrefslogtreecommitdiffstats
path: root/src/spdk/test/dd/common.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/spdk/test/dd/common.sh')
-rw-r--r--src/spdk/test/dd/common.sh154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/spdk/test/dd/common.sh b/src/spdk/test/dd/common.sh
new file mode 100644
index 000000000..d2f7defa3
--- /dev/null
+++ b/src/spdk/test/dd/common.sh
@@ -0,0 +1,154 @@
+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.
+
+ 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": [
+ ${config[*]}
+ ]
+ }
+ ${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"
+}
+
+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
+}