aboutsummaryrefslogtreecommitdiff
path: root/tests/ubi-tests/ubi-stress-test.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ubi-tests/ubi-stress-test.sh.in')
-rwxr-xr-xtests/ubi-tests/ubi-stress-test.sh.in215
1 files changed, 215 insertions, 0 deletions
diff --git a/tests/ubi-tests/ubi-stress-test.sh.in b/tests/ubi-tests/ubi-stress-test.sh.in
new file mode 100755
index 0000000..42ccec5
--- /dev/null
+++ b/tests/ubi-tests/ubi-stress-test.sh.in
@@ -0,0 +1,215 @@
+#!/bin/sh -euf
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+bindir=@bindir@
+libexecpath=@libexecdir@/mtd-utils
+TESTBINDIR=@testbindir@
+
+fatal()
+{
+ echo "Error: $1" 1>&2
+ exit 1
+}
+
+usage()
+{
+ cat 1>&2 <<EOF
+Stress-test an UBI device. This test is basically built on top of
+'runubitests.sh' and runs it several times for different configurations.
+
+The nandsim and mtdram drivers have to be compiled as kernel modules.
+
+Usage:
+ ${0##*/} run
+EOF
+}
+
+cleanup_handler()
+{
+ local ret="$1"
+ rmmod ubi >/dev/null 2>&1 ||:
+ rmmod nandsim >/dev/null 2>&1 ||:
+ rmmod mtdram >/dev/null 2>&1 ||:
+
+ # Below is magic to exit with correct exit code
+ if [ "$ret" != "0" ]; then
+ trap false EXIT
+ else
+ trap true EXIT
+ fi
+}
+trap 'cleanup_handler $?' EXIT
+trap 'cleanup_handler 1' HUP PIPE INT QUIT TERM
+
+# Find MTD device number by pattern in /proc/mtd
+# Usage: find_mtd_device <pattern>
+find_mtd_device()
+{
+ printf "%s" "$(grep "$1" /proc/mtd | sed -e "s/^mtd\([0-9]\+\):.*$/\1/")"
+}
+
+# Just print parameters of the 'run_test' funcion in a user-friendly form.
+print_params()
+{
+ local module="$1"; shift
+ local size="$1"; shift
+ local peb_size="$1"; shift
+ local page_size="$1"; shift
+ local vid_offs="$1"; shift
+ local fastmap="$1"; shift
+
+ printf "%s" "$module: ${size}MiB, PEB size ${peb_size}KiB, "
+ if [ "$module" = "nandsim" ]; then
+ printf "%s" "page size ${page_size}KiB, VID offset $vid_offs, "
+ fi
+ printf "%s\n" "fastmap $fastmap"
+}
+
+# Load mtdram with specified size and PEB size
+# Usage: load_mtdram <flash size> <PEB size>
+# 1. Flash size is specified in MiB
+# 2. PEB size is specified in KiB
+load_mtdram()
+{
+ local size="$1"; shift
+ local peb_size="$1"; shift
+
+ size="$(($size * 1024))"
+ modprobe mtdram total_size="$size" erase_size="$peb_size" ||
+ echo "Error: cannot load $size MiB mtdram"
+}
+
+print_separator()
+{
+ echo "======================================================================"
+}
+
+# Run a test on nandsim or mtdram with certain geometry.
+# Usage: run_test <nandsim|mtdram> <flash size> <PEB size> \
+# <Page size> <VID hdr offs> <enable fastmap>
+# 1. Simulator type (nandsim or mtdram)
+# 2. Flash size is specified in MiB
+# 3. PEB size is specified in KiB
+# 4. Page size is specified in bytes (mtdram ingores this)
+# 5. VID header offset (mtdram ingores this)
+# 6. Whether fast-map should be enabled (pass "enabled" or "disabled")
+run_test()
+{
+ local module="$1";
+ local size="$2";
+ local peb_size="$3";
+ local page_size="$4";
+ local vid_offs="$5"
+ local fastmap="$6";
+ local fm_supported fm_param mtdnum
+
+ print_separator
+
+ # Check if fastmap is supported by UBI
+ if modinfo ubi | grep -q fm_auto; then
+ fm_supported="yes"
+ else
+ fm_supported="no"
+ fi
+
+ if [ "$fastmap" = "enabled" ]; then
+ fm_param=
+ elif [ "$fm_supported" = "yes" ]; then
+ fastmap="disabled"
+ fm_param="fm_auto"
+ else
+ echo "Fastmap is not supported, skip"
+ return 0
+ fi
+
+ if [ "$module" = "nandsim" ]; then
+ print_params "$@"
+
+ $TESTBINDIR/load_nandsim.sh "$size" "$peb_size" "$page_size" ||
+ echo "Cannot load nandsim, test skipped"
+
+ mtdnum="$(find_mtd_device "$nandsim_patt")"
+ elif [ "$module" = "mtdram" ]; then
+ print_params "$@"
+
+ load_mtdram "$size" "$peb_size"
+
+ mtdnum="$(find_mtd_device "$mtdram_patt")"
+ else
+ fatal "$module is not supported" ||
+ echo "Cannot load nandsim, test skipped"
+ fi
+
+ modprobe ubi mtd="$mtdnum,$vid_offs" $fm_param
+ $TESTBINDIR/runubitests.sh /dev/ubi0 ||:
+
+ sudo rmmod ubi
+ sudo rmmod "$module"
+}
+
+if [ "$#" -lt 1 ] || [ "$1" != "run" ]; then
+ usage
+ exit 1
+fi
+
+# Make sure neither mtdram nor nandsim are used
+nandsim_patt="NAND simulator"
+mtdram_patt="mtdram test device"
+if [ -e /proc/mtd ]; then
+ ! grep -q "$nandsim_patt" /proc/mtd ||
+ fatal "the nandsim driver is already used"
+ ! grep -q "$mtdram_patt" /proc/mtd ||
+ fatal "the mtdram driver is already used"
+fi
+
+rmmod ubi >/dev/null 2>&1 ||:
+
+for module in "mtdram" "nandsim"; do
+ for fm in "enabled" "disabled"; do
+ for vid_factor in 1 0; do
+ print_separator
+ print_separator
+ print_separator
+ echo "Test on $module, fastmap $fm, VID header offset factor $vid_factor"
+ print_separator
+ print_separator
+
+ pg_size="512"
+ vid_offs="$(($pg_size * $vid_factor))"
+
+ run_test "$module" "16" "16" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "32" "16" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "64" "16" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "128" "16" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "256" "16" "$pg_size" "$vid_offs" "$fm"
+
+ pg_size="2048"
+ vid_offs="$(($pg_size * $vid_factor))"
+
+ run_test "$module" "64" "64" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "128" "64" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "256" "64" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "512" "64" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "1024" "64" "$pg_size" "$vid_offs" "$fm"
+
+ run_test "$module" "64" "128" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "128" "128" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "256" "128" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "512" "128" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "1024" "128" "$pg_size" "$vid_offs" "$fm"
+
+ run_test "$module" "64" "256" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "128" "256" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "256" "256" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "512" "256" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "1024" "256" "$pg_size" "$vid_offs" "$fm"
+
+ run_test "$module" "64" "512" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "128" "512" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "256" "512" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "512" "512" "$pg_size" "$vid_offs" "$fm"
+ run_test "$module" "1024" "512" "$pg_size" "$vid_offs" "$fm"
+ done
+ done
+done