blob: 50c563ab2d773d50a20b2cf3632c22dfa7fa6b8b [file] [log] [blame] [edit]
#!/bin/sh -euf
srcdir="$(readlink -ev -- ${0%/*})"
PATH="$srcdir:$srcdir/../..:$PATH"
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
'runtests.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 "$@"
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
runtests.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