[PATCH v2 1/2] selftests/mm: track the modules run_vmtests.sh loads
From: Qiliang Yuan
Date: Sat Oct 17 2026 - 11:07:46 EST
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 <odys.yuan@xxxxxxxxx>
---
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