^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/bin/bash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) # Copyright (C) 2017 Luis R. Rodriguez <mcgrof@kernel.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) # This program is free software; you can redistribute it and/or modify it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) # under the terms of the GNU General Public License as published by the Free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) # Software Foundation; either version 2 of the License, or at your option any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) # later version; or, when distributed separately from the Linux kernel or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) # when incorporated into other software packages, subject to the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) # license:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) # This program is free software; you can redistribute it and/or modify it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) # under the terms of copyleft-next (version 0.3.1 or later) as published
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) # at http://copyleft-next.org/.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) # This is a stress test script for kmod, the kernel module loader. It uses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) # test_kmod which exposes a series of knobs for the API for us so we can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) # tweak each test in userspace rather than in kernelspace.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) # The way kmod works is it uses the kernel's usermode helper API to eventually
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) # call /sbin/modprobe. It has a limit of the number of concurrent calls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) # possible. The kernel interface to load modules is request_module(), however
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) # mount uses get_fs_type(). Both behave slightly differently, but the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) # differences are important enough to test each call separately. For this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) # reason test_kmod starts by providing tests for both calls.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) # The test driver test_kmod assumes a series of defaults which you can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) # override by exporting to your environment prior running this script.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) # For instance this script assumes you do not have xfs loaded upon boot.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) # If this is false, export DEFAULT_KMOD_FS="ext4" prior to running this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) # script if the filesystem module you don't have loaded upon bootup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) # is ext4 instead. Refer to allow_user_defaults() for a list of user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) # override variables possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) # You'll want at least 4 GiB of RAM to expect to run these tests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) # without running out of memory on them. For other requirements refer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) # to test_reqs()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) set -e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) TEST_NAME="kmod"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) TEST_DRIVER="test_${TEST_NAME}"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) TEST_DIR=$(dirname $0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) # This represents
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) # TEST_ID:TEST_COUNT:ENABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) # TEST_ID: is the test id number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) # TEST_COUNT: number of times we should run the test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) # ENABLED: 1 if enabled, 0 otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) # Once these are enabled please leave them as-is. Write your own test,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) # we have tons of space.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ALL_TESTS="0001:3:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ALL_TESTS="$ALL_TESTS 0002:3:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ALL_TESTS="$ALL_TESTS 0003:1:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ALL_TESTS="$ALL_TESTS 0004:1:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) ALL_TESTS="$ALL_TESTS 0005:10:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ALL_TESTS="$ALL_TESTS 0006:10:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ALL_TESTS="$ALL_TESTS 0007:5:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ALL_TESTS="$ALL_TESTS 0008:150:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ALL_TESTS="$ALL_TESTS 0009:150:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) ALL_TESTS="$ALL_TESTS 0010:1:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) ALL_TESTS="$ALL_TESTS 0011:1:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ALL_TESTS="$ALL_TESTS 0012:1:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) ALL_TESTS="$ALL_TESTS 0013:1:1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) # Kselftest framework requirement - SKIP code is 4.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) ksft_skip=4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) test_modprobe()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if [ ! -d $DIR ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) echo "$0: $DIR not present" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) echo "You must have the following enabled in your kernel:" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) cat $TEST_DIR/config >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) exit $ksft_skip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) function allow_user_defaults()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) if [ -z $DEFAULT_KMOD_DRIVER ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) DEFAULT_KMOD_DRIVER="test_module"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if [ -z $DEFAULT_KMOD_FS ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) DEFAULT_KMOD_FS="xfs"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) if [ -z $PROC_DIR ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) PROC_DIR="/proc/sys/kernel/"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if [ -z $MODPROBE_LIMIT ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) MODPROBE_LIMIT=50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) if [ -z $DIR ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) DIR="/sys/devices/virtual/misc/${TEST_DRIVER}0/"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) if [ -z $DEFAULT_NUM_TESTS ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) DEFAULT_NUM_TESTS=150
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) MODPROBE_LIMIT_FILE="${PROC_DIR}/kmod-limit"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) test_reqs()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) if ! which modprobe 2> /dev/null > /dev/null; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) echo "$0: You need modprobe installed" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) exit $ksft_skip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if ! which kmod 2> /dev/null > /dev/null; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) echo "$0: You need kmod installed" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) exit $ksft_skip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) # kmod 19 has a bad bug where it returns 0 when modprobe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) # gets called *even* if the module was not loaded due to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) # some bad heuristics. For details see:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) # A work around is possible in-kernel but its rather
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) # complex.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) KMOD_VERSION=$(kmod --version | awk '{print $3}')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) if [[ $KMOD_VERSION -le 19 ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) echo "$0: You need at least kmod 20" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) echo "kmod <= 19 is buggy, for details see:" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) echo "https://git.kernel.org/cgit/utils/kernel/kmod/kmod.git/commit/libkmod/libkmod-module.c?id=fd44a98ae2eb5eb32161088954ab21e58e19dfc4" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) exit $ksft_skip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) uid=$(id -u)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if [ $uid -ne 0 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) echo $msg must be run as root >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) exit $ksft_skip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) function load_req_mod()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) trap "test_modprobe" EXIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) if [ ! -d $DIR ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) # Alanis: "Oh isn't it ironic?"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) modprobe $TEST_DRIVER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) test_finish()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) echo "$MODPROBE" > /proc/sys/kernel/modprobe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) echo "Test completed"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) errno_name_to_val()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) case "$1" in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) # kmod calls modprobe and upon of a module not found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) # modprobe returns just 1... However in the kernel we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) # *sometimes* see 256...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) MODULE_NOT_FOUND)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) echo 256;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) echo 0;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) -EPERM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) echo -1;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) -ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) echo -2;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) -EINVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) echo -22;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) -ERR_ANY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) echo -123456;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) echo invalid;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) esac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) errno_val_to_name()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) case "$1" in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) echo MODULE_NOT_FOUND;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) echo SUCCESS;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) echo -EPERM;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) -2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) echo -ENOENT;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) -22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) echo -EINVAL;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) -123456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) echo -ERR_ANY;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) echo invalid;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) esac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) config_set_test_case_driver()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) if ! echo -n 1 >$DIR/config_test_case; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) echo "$0: Unable to set to test case to driver" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) config_set_test_case_fs()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) if ! echo -n 2 >$DIR/config_test_case; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) echo "$0: Unable to set to test case to fs" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) config_num_threads()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) if ! echo -n $1 >$DIR/config_num_threads; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) echo "$0: Unable to set to number of threads" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) config_get_modprobe_limit()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if [[ -f ${MODPROBE_LIMIT_FILE} ]] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) MODPROBE_LIMIT=$(cat $MODPROBE_LIMIT_FILE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) echo $MODPROBE_LIMIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) config_num_thread_limit_extra()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) MODPROBE_LIMIT=$(config_get_modprobe_limit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) let EXTRA_LIMIT=$MODPROBE_LIMIT+$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) config_num_threads $EXTRA_LIMIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) # For special characters use printf directly,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) # refer to kmod_test_0001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) config_set_driver()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) if ! echo -n $1 >$DIR/config_test_driver; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) echo "$0: Unable to set driver" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) config_set_fs()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if ! echo -n $1 >$DIR/config_test_fs; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) echo "$0: Unable to set driver" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) config_get_driver()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) cat $DIR/config_test_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) config_get_test_result()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) cat $DIR/test_result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) config_reset()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) if ! echo -n "1" >"$DIR"/reset; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) echo "$0: reset should have worked" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) config_show_config()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) echo "----------------------------------------------------"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) cat "$DIR"/config
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) echo "----------------------------------------------------"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) config_trigger()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if ! echo -n "1" >"$DIR"/trigger_config 2>/dev/null; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) echo "$1: FAIL - loading should have worked"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) config_show_config
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) echo "$1: OK! - loading kmod test"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) config_trigger_want_fail()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if echo "1" > $DIR/trigger_config 2>/dev/null; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) echo "$1: FAIL - test case was expected to fail"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) config_show_config
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) echo "$1: OK! - kmod test case failed as expected"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) config_expect_result()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) RC=$(config_get_test_result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) RC_NAME=$(errno_val_to_name $RC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) ERRNO_NAME=$2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) ERRNO=$(errno_name_to_val $ERRNO_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) if [[ $ERRNO_NAME = "-ERR_ANY" ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if [[ $RC -ge 0 ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) echo "$1: FAIL, test expects $ERRNO_NAME - got $RC_NAME ($RC)" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) config_show_config
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) elif [[ $RC != $ERRNO ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) echo "$1: FAIL, test expects $ERRNO_NAME ($ERRNO) - got $RC_NAME ($RC)" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) config_show_config
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) echo "$1: OK! - Return value: $RC ($RC_NAME), expected $ERRNO_NAME"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) kmod_defaults_driver()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) config_reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) modprobe -r $DEFAULT_KMOD_DRIVER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) config_set_driver $DEFAULT_KMOD_DRIVER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) kmod_defaults_fs()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) config_reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) modprobe -r $DEFAULT_KMOD_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) config_set_fs $DEFAULT_KMOD_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) config_set_test_case_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) kmod_test_0001_driver()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) NAME='\000'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) kmod_defaults_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) config_num_threads 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) printf $NAME >"$DIR"/config_test_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) config_expect_result ${FUNCNAME[0]} MODULE_NOT_FOUND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) kmod_test_0001_fs()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) NAME='\000'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) kmod_defaults_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) config_num_threads 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) printf $NAME >"$DIR"/config_test_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) config_expect_result ${FUNCNAME[0]} -EINVAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) kmod_test_0001()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) kmod_test_0001_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) kmod_test_0001_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) kmod_test_0002_driver()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) NAME="nope-$DEFAULT_KMOD_DRIVER"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) kmod_defaults_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) config_set_driver $NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) config_num_threads 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) config_expect_result ${FUNCNAME[0]} MODULE_NOT_FOUND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) kmod_test_0002_fs()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) NAME="nope-$DEFAULT_KMOD_FS"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) kmod_defaults_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) config_set_fs $NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) config_expect_result ${FUNCNAME[0]} -EINVAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) kmod_test_0002()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) kmod_test_0002_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) kmod_test_0002_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) kmod_test_0003()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) kmod_defaults_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) config_num_threads 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) config_expect_result ${FUNCNAME[0]} SUCCESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) kmod_test_0004()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) kmod_defaults_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) config_num_threads 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) config_expect_result ${FUNCNAME[0]} SUCCESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) kmod_test_0005()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) kmod_defaults_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) config_expect_result ${FUNCNAME[0]} SUCCESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) kmod_test_0006()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) kmod_defaults_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) config_expect_result ${FUNCNAME[0]} SUCCESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) kmod_test_0007()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) kmod_test_0005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) kmod_test_0006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) kmod_test_0008()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) kmod_defaults_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) MODPROBE_LIMIT=$(config_get_modprobe_limit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) let EXTRA=$MODPROBE_LIMIT/6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) config_num_thread_limit_extra $EXTRA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) config_expect_result ${FUNCNAME[0]} SUCCESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) kmod_test_0009()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) kmod_defaults_fs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) MODPROBE_LIMIT=$(config_get_modprobe_limit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) let EXTRA=$MODPROBE_LIMIT/4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) config_num_thread_limit_extra $EXTRA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) config_expect_result ${FUNCNAME[0]} SUCCESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) kmod_test_0010()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) kmod_defaults_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) config_num_threads 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) echo "/KMOD_TEST_NONEXISTENT" > /proc/sys/kernel/modprobe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) config_expect_result ${FUNCNAME[0]} -ENOENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) echo "$MODPROBE" > /proc/sys/kernel/modprobe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) kmod_test_0011()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) kmod_defaults_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) config_num_threads 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) # This causes the kernel to not even try executing modprobe. The error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) # code is still -ENOENT like when modprobe doesn't exist, so we can't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) # easily test for the exact difference. But this still is a useful test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) # since there was a bug where request_module() returned 0 in this case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) echo > /proc/sys/kernel/modprobe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) config_trigger ${FUNCNAME[0]}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) config_expect_result ${FUNCNAME[0]} -ENOENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) echo "$MODPROBE" > /proc/sys/kernel/modprobe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) kmod_check_visibility()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) local name="$1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) local cmd="$2"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) modprobe $DEFAULT_KMOD_DRIVER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) local priv=$(eval $cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) local unpriv=$(capsh --drop=CAP_SYSLOG -- -c "$cmd")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) if [ "$priv" = "$unpriv" ] || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) [ "${priv:0:3}" = "0x0" ] || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) [ "${unpriv:0:3}" != "0x0" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) echo "${FUNCNAME[0]}: FAIL, $name visible to unpriv: '$priv' vs '$unpriv'" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) echo "${FUNCNAME[0]}: OK!"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) kmod_test_0012()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) kmod_check_visibility /proc/modules \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) "grep '^${DEFAULT_KMOD_DRIVER}\b' /proc/modules | awk '{print \$NF}'"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) kmod_test_0013()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) kmod_check_visibility '/sys/module/*/sections/*' \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) "cat /sys/module/${DEFAULT_KMOD_DRIVER}/sections/.*text | head -n1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) list_tests()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) echo "Test ID list:"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) echo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) echo "TEST_ID x NUM_TEST"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) echo "TEST_ID: Test ID"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) echo "NUM_TESTS: Number of recommended times to run the test"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) echo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) echo "0001 x $(get_test_count 0001) - Simple test - 1 thread for empty string"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) echo "0002 x $(get_test_count 0002) - Simple test - 1 thread for modules/filesystems that do not exist"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) echo "0003 x $(get_test_count 0003) - Simple test - 1 thread for get_fs_type() only"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) echo "0004 x $(get_test_count 0004) - Simple test - 2 threads for get_fs_type() only"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) echo "0005 x $(get_test_count 0005) - multithreaded tests with default setup - request_module() only"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) echo "0006 x $(get_test_count 0006) - multithreaded tests with default setup - get_fs_type() only"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) echo "0007 x $(get_test_count 0007) - multithreaded tests with default setup test request_module() and get_fs_type()"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) echo "0008 x $(get_test_count 0008) - multithreaded - push kmod_concurrent over max_modprobes for request_module()"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) echo "0009 x $(get_test_count 0009) - multithreaded - push kmod_concurrent over max_modprobes for get_fs_type()"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) echo "0010 x $(get_test_count 0010) - test nonexistent modprobe path"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) echo "0011 x $(get_test_count 0011) - test completely disabling module autoloading"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) echo "0012 x $(get_test_count 0012) - test /proc/modules address visibility under CAP_SYSLOG"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) echo "0013 x $(get_test_count 0013) - test /sys/module/*/sections/* visibility under CAP_SYSLOG"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) usage()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) NUM_TESTS=$(grep -o ' ' <<<"$ALL_TESTS" | grep -c .)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) let NUM_TESTS=$NUM_TESTS+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) MAX_TEST=$(printf "%04d\n" $NUM_TESTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) echo "Usage: $0 [ -t <4-number-digit> ] | [ -w <4-number-digit> ] |"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) echo " [ -s <4-number-digit> ] | [ -c <4-number-digit> <test- count>"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) echo " [ all ] [ -h | --help ] [ -l ]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) echo ""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) echo "Valid tests: 0001-$MAX_TEST"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) echo ""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) echo " all Runs all tests (default)"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) echo " -t Run test ID the number amount of times is recommended"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) echo " -w Watch test ID run until it runs into an error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) echo " -s Run test ID once"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) echo " -c Run test ID x test-count number of times"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) echo " -l List all test ID list"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) echo " -h|--help Help"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) echo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) echo "If an error every occurs execution will immediately terminate."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) echo "If you are adding a new test try using -w <test-ID> first to"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) echo "make sure the test passes a series of tests."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) echo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) echo Example uses:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) echo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) echo "${TEST_NAME}.sh -- executes all tests"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) echo "${TEST_NAME}.sh -t 0008 -- Executes test ID 0008 number of times is recommended"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) echo "${TEST_NAME}.sh -w 0008 -- Watch test ID 0008 run until an error occurs"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) echo "${TEST_NAME}.sh -s 0008 -- Run test ID 0008 once"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) echo "${TEST_NAME}.sh -c 0008 3 -- Run test ID 0008 three times"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) echo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) list_tests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) function test_num()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) re='^[0-9]+$'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) if ! [[ $1 =~ $re ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) usage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) function get_test_data()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) test_num $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) local field_num=$(echo $1 | sed 's/^0*//')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) echo $ALL_TESTS | awk '{print $'$field_num'}'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) function get_test_count()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) TEST_DATA=$(get_test_data $1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) LAST_TWO=${TEST_DATA#*:*}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) echo ${LAST_TWO%:*}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) function get_test_enabled()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) TEST_DATA=$(get_test_data $1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) echo ${TEST_DATA#*:*:}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) function run_all_tests()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) for i in $ALL_TESTS ; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) TEST_ID=${i%:*:*}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) ENABLED=$(get_test_enabled $TEST_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) TEST_COUNT=$(get_test_count $TEST_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) if [[ $ENABLED -eq "1" ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) test_case $TEST_ID $TEST_COUNT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) function watch_log()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) if [ $# -ne 3 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) clear
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) date
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) echo "Running test: $2 - run #$1"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) function watch_case()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) i=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) while [ 1 ]; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) if [ $# -eq 1 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) test_num $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) watch_log $i ${TEST_NAME}_test_$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) ${TEST_NAME}_test_$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) watch_log $i all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) run_all_tests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) let i=$i+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) function test_case()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) NUM_TESTS=$DEFAULT_NUM_TESTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) if [ $# -eq 2 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) NUM_TESTS=$2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) i=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) while [ $i -lt $NUM_TESTS ]; do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) test_num $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) watch_log $i ${TEST_NAME}_test_$1 noclear
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) RUN_TEST=${TEST_NAME}_test_$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) $RUN_TEST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) let i=$i+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) function parse_args()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if [ $# -eq 0 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) run_all_tests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) if [[ "$1" = "all" ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) run_all_tests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) elif [[ "$1" = "-w" ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) shift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) watch_case $@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) elif [[ "$1" = "-t" ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) shift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) test_num $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) test_case $1 $(get_test_count $1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) elif [[ "$1" = "-c" ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) shift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) test_num $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) test_num $2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) test_case $1 $2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) elif [[ "$1" = "-s" ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) shift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) test_case $1 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) elif [[ "$1" = "-l" ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) list_tests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) elif [[ "$1" = "-h" || "$1" = "--help" ]]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) usage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) usage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) test_reqs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) allow_user_defaults
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) load_req_mod
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) MODPROBE=$(</proc/sys/kernel/modprobe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) trap "test_finish" EXIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) parse_args $@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) exit 0