3 # Copyright (C) 2020 Western Digital Corporation or its affiliates.
5 # This file is released under the GPL.
7 # Run t/zbd/test-zbd-support script against a variety of conventional,
8 # zoned and mixed zone configurations.
13 echo "This script runs the tests from t/zbd/test-zbd-support script"
14 echo "against a nullb device in a variety of conventional and zoned"
15 echo "configurations."
16 echo "Usage: ${0} [OPTIONS]"
18 echo -e "\t-h Show this message."
19 echo -e "\t-L List the device layouts for every section without running"
21 echo -e "\t-s <#section> Only run the section with the given number."
22 echo -e "\t-l Use libzbc ioengine to run the tests."
23 echo -e "\t-o <max_open_zones> Specify MaxOpen value, (${set_max_open} by default)."
24 echo -e "\t-n <#number of runs> Set the number of times to run the entire suite "
25 echo -e "\t or an individual section/test."
26 echo -e "\t-r Remove the /dev/nullb0 device that may still exist after"
27 echo -e "\t running this script."
33 for d in /sys/kernel/config/nullb/*; do [ -d "$d" ] && rmdir "$d"; done
35 modprobe null_blk nr_devices=0 || exit $?
36 for d in /sys/kernel/config/nullb/*; do
37 [ -d "$d" ] && rmdir "$d"
40 [ -e /sys/module/null_blk ] && exit $?
45 modprobe null_blk nr_devices=0 &&
46 cd /sys/kernel/config/nullb &&
48 cd nullb0 || return $?
53 echo 0 > completion_nsec &&
54 echo ${dev_blocksize} > blocksize &&
55 echo ${dev_size} > size &&
56 echo 1 > memory_backed || return $?
58 if ((conv_pcnt < 100)); then
60 echo "${zone_size}" > zone_size || return $?
62 if ((zone_capacity < zone_size)); then
63 if ((!zcap_supported)); then
64 echo "null_blk does not support zone capacity"
67 echo "${zone_capacity}" > zone_capacity
69 if ((conv_pcnt)); then
70 if ((!conv_supported)); then
71 echo "null_blk does not support conventional zones"
74 nr_conv=$((dev_size/zone_size*conv_pcnt/100))
75 echo "${nr_conv}" > zone_nr_conv
79 echo 1 > power || return $?
85 if ((conv_pcnt < 100)); then
86 echo " $(printf "Zoned Device, %d%% Conventional Zones (%d)" \
87 ${conv_pcnt} ${nr_conv})"
88 echo " $(printf "Zone Size: %d MB" ${zone_size})"
89 echo " $(printf "Zone Capacity: %d MB" ${zone_capacity})"
91 echo " $(printf "Max Open: %d Zones" ${max_open})"
93 echo " Max Open: Unlimited Zones"
96 echo " Non-zoned Device"
103 # Fully conventional device.
110 # Zoned device with no conventional zones, ZCAP == ZSIZE, unlimited MaxOpen.
119 # Zoned device with no conventional zones, ZCAP < ZSIZE, unlimited MaxOpen.
128 # Zoned device with mostly sequential zones, ZCAP == ZSIZE, unlimited MaxOpen.
137 # Zoned device with mostly sequential zones, ZCAP < ZSIZE, unlimited MaxOpen.
146 # Zoned device with mostly conventional zones, ZCAP == ZSIZE, unlimited MaxOpen.
155 # Zoned device with mostly conventional zones, ZCAP < ZSIZE, unlimited MaxOpen.
165 # Zoned device with no conventional zones, ZCAP == ZSIZE, limited MaxOpen.
172 max_open=${set_max_open}
173 zbd_test_opts+=("-o ${max_open}")
176 # Zoned device with no conventional zones, ZCAP < ZSIZE, limited MaxOpen.
182 max_open=${set_max_open}
183 zbd_test_opts+=("-o ${max_open}")
186 # Zoned device with mostly sequential zones, ZCAP == ZSIZE, limited MaxOpen.
192 max_open=${set_max_open}
193 zbd_test_opts+=("-o ${max_open}")
196 # Zoned device with mostly sequential zones, ZCAP < ZSIZE, limited MaxOpen.
202 max_open=${set_max_open}
203 zbd_test_opts+=("-o ${max_open}")
206 # Zoned device with mostly conventional zones, ZCAP == ZSIZE, limited MaxOpen.
212 max_open=${set_max_open}
213 zbd_test_opts+=("-o ${max_open}")
216 # Zoned device with mostly conventional zones, ZCAP < ZSIZE, limited MaxOpen.
223 max_open=${set_max_open}
224 zbd_test_opts+=("-o ${max_open}")
231 scriptdir="$(cd "$(dirname "$0")" && pwd)"
245 -s) sections+=("$2"); shift; shift;;
246 -o) set_max_open="${2}"; shift; shift;;
247 -L) list_only=1; shift;;
248 -r) cleanup_nullb; exit 0;;
249 -l) libzbc=1; shift;;
250 -n) num_of_runs="${2}"; shift; shift;;
257 if [ "${#sections[@]}" = 0 ]; then
258 readarray -t sections < <(declare -F | grep "section[0-9]*" | tr -c -d "[:digit:]\n" | sort -n)
264 # Test creating null_blk device and check if newer features are supported
266 if ! eval "create_nullb"; then
267 echo "can't create nullb"
270 if ! cat /sys/kernel/config/nullb/features | grep -q zone_capacity; then
273 if ! cat /sys/kernel/config/nullb/features | grep -q zone_nr_conv; then
281 trap 'kill ${zbd_test_pid}; intr=1' SIGINT
283 while ((run_nr <= $num_of_runs)); do
284 echo -e "\nRun #$run_nr:"
285 for section_number in "${sections[@]}"; do
287 echo "---------- Section $(printf "%02d" $section_number) ----------"
288 if ! eval "create_nullb"; then
289 echo "error creating nullb"
293 section$section_number
296 ((rc == 2)) && continue
298 echo "can't set up nullb for section $(printf "%02d" $section_number)"
303 if ((zone_capacity < zone_size)); then
304 echo "libzbc doesn't support zone capacity, skipping section $(printf "%02d" $section_number)"
307 if ((conv_pcnt == 100)); then
308 echo "libzbc only supports zoned devices, skipping section $(printf "%02d" $section_number)"
311 zbd_test_opts+=("-l")
315 ((list_only)) && continue
317 ./test-zbd-support ${zbd_test_opts[@]} /dev/nullb0 &
319 if kill -0 "${zbd_test_pid}"; then
320 wait "${zbd_test_pid}"
323 echo "can't run ZBD tests"
330 run_nr=$((run_nr + 1))
333 if ((!list_only)); then
334 echo "--------------------------------"
335 echo "Total run time: $(TZ=UTC0 printf "%(%H:%M:%S)T\n" $(( SECONDS )) )"