run_vmtests.sh loads hwpoison_inject for the memory-failure test when it
is not there yet, remembers that in a variable local to run_test() and
unloads the module right after the test.

The thp tests need xfs loaded in the same way, and repeating the load,
the bookkeeping and the unload for every module that some test needs
does not scale.

Add load_module(), which loads a module unless it is already present
and records it, and unload every recorded module, in reverse order,
before the script exits. Use it for hwpoison_inject.

Signed-off-by: Qiliang Yuan <[email protected]>
---
 tools/testing/selftests/mm/run_vmtests.sh | 31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/tools/testing/selftests/mm/run_vmtests.sh 
b/tools/testing/selftests/mm/run_vmtests.sh
index d09f9f6a384ee..56f5416681da7 100755
--- a/tools/testing/selftests/mm/run_vmtests.sh
+++ b/tools/testing/selftests/mm/run_vmtests.sh
@@ -177,11 +177,30 @@ pretty_name() {
        echo "$*" | sed -e 's/^\(bash \)\?\.\///'
 }
 
+# Modules this script loaded, unloaded again before it exits
+LOADED_MODULES=()
+
+# Usage: load_module [module]
+load_module() {
+       if [ -d "/sys/module/$1" ]; then
+               return 0
+       fi
+       modprobe -q "$1" || return 1
+       LOADED_MODULES+=("$1")
+}
+
+unload_modules() {
+       local i
+
+       for (( i = ${#LOADED_MODULES[@]} - 1; i >= 0; i-- )); do
+               modprobe -r -q "${LOADED_MODULES[i]}"
+       done
+}
+
 # Usage: run_test [test binary] [arbitrary test arguments...]
 run_test() {
        if test_selected ${CATEGORY}; then
                local skip=0
-               local LOADED_HWPOISON_INJECT_MOD=0
 
                # On memory constrainted systems some tests can fail to 
allocate hugepages.
                # perform some cleanup before the test for a higher success 
rate.
@@ -207,8 +226,7 @@ run_test() {
                                                | tap_prefix
                                        skip=1
                                else
-                                       modprobe hwpoison_inject > /dev/null 
2>&1
-                                       LOADED_HWPOISON_INJECT_MOD=1
+                                       load_module hwpoison_inject
                                        if [ ! -d "$HWPOISON_DIR" ]; then
                                                echo "hwpoison debugfs 
interface not present" \
                                                        | tap_prefix
@@ -231,11 +249,6 @@ run_test() {
                        local ret=${PIPESTATUS[0]}
                fi
 
-               # Unload hwpoison_inject if we loaded it
-               if [ "${LOADED_HWPOISON_INJECT_MOD}" = "1" ]; then
-                       modprobe -r hwpoison_inject > /dev/null 2>&1
-               fi
-
                count_total=$(( count_total + 1 ))
                if [ $ret -eq 0 ]; then
                        count_pass=$(( count_pass + 1 ))
@@ -465,4 +478,6 @@ CATEGORY="memory-failure" run_test ./memory-failure
 echo "SUMMARY: PASS=${count_pass} SKIP=${count_skip} FAIL=${count_fail}" | 
tap_prefix
 echo "1..${count_total}" | tap_output
 
+unload_modules
+
 exit $exitcode

-- 
2.43.0


Reply via email to