On 07/04/26 20:21, Zi Yan wrote:
On 6 Apr 2026, at 5:19, Sayali Patil wrote:

run_vmtests.sh contains special handling to ensure the hwpoison_inject
module is available for the memory-failure tests. This logic was
implemented outside of run_test(), making the setup category-specific
but managed globally.

Move the hwpoison_inject handling into run_test() and restrict it
to the memory-failure category so that:
1. the module is checked and loaded only when memory-failure tests run,
2. the test is skipped if the module or the debugfs interface
(/sys/kernel/debug/hwpoison/) is not available.
3. the module is unloaded after the test if it was loaded by the script.

This localizes category-specific setup and makes the test flow
consistent with other per-category preparations.

While updating this logic, fix the module availability check.
The script previously used:

        modprobe -R hwpoison_inject

The -R option prints the resolved module name to stdout, causing every
run to print:

        hwpoison_inject

in the test output, even when no action is required, introducing
unnecessary noise.

Replace this with:

        modprobe -n hwpoison_inject

which verifies that the module is loadable without producing output,
keeping the selftest logs clean and consistent.

Also, ensure that skipped tests do not override a previously recorded
failure. A skipped test currently sets exitcode to ksft_skip even if a
prior test has failed, which can mask failures in the final exit status.
Update the logic to only set exitcode to ksft_skip when no failure has
been recorded.

Fixes: ff4ef2fbd101 ("selftests/mm: add memory failure anonymous page test")
Signed-off-by: Sayali Patil <[email protected]>
---
  tools/testing/selftests/mm/run_vmtests.sh | 52 ++++++++++++++---------
  1 file changed, 33 insertions(+), 19 deletions(-)

diff --git a/tools/testing/selftests/mm/run_vmtests.sh 
b/tools/testing/selftests/mm/run_vmtests.sh
index afdcfd0d7cef..17c9bd910c47 100755
--- a/tools/testing/selftests/mm/run_vmtests.sh
+++ b/tools/testing/selftests/mm/run_vmtests.sh
@@ -235,6 +235,7 @@ pretty_name() {
  run_test() {
        if test_selected ${CATEGORY}; then
                local skip=0
+               local LOADED_MOD=0

Can you rename it to LOADED_MEMORY_FAILURE_MOD to clarify its use?
Since now LOADED_MOD is visible for the entire run_test().

Thanks for the review!

I kept it as LOADED_MOD and specified it as a local variable intentionally. The idea was that, if any future tests are added that need to verify whether the module was loaded, they can reuse the same variable. For that reason, I did not make it specific to the memory failure test.

Please let me know if you think otherwise.

Regards,
Sayali

                # On memory constrainted systems some tests can fail to 
allocate hugepages.
                # perform some cleanup before the test for a higher success 
rate.
@@ -250,6 +251,28 @@ run_test() {
                        fi
                fi

+               # Ensure hwpoison_inject is available for memory-failure tests
+               if [ "${CATEGORY}" = "memory-failure" ]; then
+                       # Try to load hwpoison_inject if not present.
+                       HWPOISON_DIR=/sys/kernel/debug/hwpoison/
+                       if [ ! -d "$HWPOISON_DIR" ]; then
+                               if ! modprobe -n hwpoison_inject > /dev/null 
2>&1; then
+                                       echo "Module hwpoison_inject not found, 
skipping..." \
+                                               | tap_prefix
+                                       skip=1
+                               else
+                                       modprobe hwpoison_inject > /dev/null 
2>&1
+                                       LOADED_MOD=1
+                                       if [ ! -d "$HWPOISON_DIR" ]; then
+                                               echo "hwpoison debugfs interface not 
present" \
+                                                       | tap_prefix
+                                               skip=1
+                                       fi
+                               fi
+                       fi
+
+               fi
+
                local test=$(pretty_name "$*")
                local title="running $*"
                local sep=$(echo -n "$title" | tr "[:graph:][:space:]" -)
@@ -261,6 +284,12 @@ run_test() {
                else
                        local ret=$ksft_skip
                fi
+
+               # Unload hwpoison_inject if we loaded it
+               if [ -n "${LOADED_MOD}" ]; 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 ))
@@ -270,7 +299,9 @@ run_test() {
                        count_skip=$(( count_skip + 1 ))
                        echo "[SKIP]" | tap_prefix
                        echo "ok ${count_total} ${test} # SKIP" | tap_output
-                       exitcode=$ksft_skip
+                       if [ $exitcode -eq 0 ]; then
+                               exitcode=$ksft_skip
+                       fi
                else
                        count_fail=$(( count_fail + 1 ))
                        echo "[FAIL]" | tap_prefix
@@ -529,24 +560,7 @@ CATEGORY="page_frag" run_test ./test_page_frag.sh 
nonaligned

  CATEGORY="rmap" run_test ./rmap

-# Try to load hwpoison_inject if not present.
-HWPOISON_DIR=/sys/kernel/debug/hwpoison/
-if [ ! -d "$HWPOISON_DIR" ]; then
-       if ! modprobe -q -R hwpoison_inject; then
-               echo "Module hwpoison_inject not found, skipping..."
-       else
-               modprobe hwpoison_inject > /dev/null 2>&1
-               LOADED_MOD=1
-       fi
-fi
-
-if [ -d "$HWPOISON_DIR" ]; then
-       CATEGORY="memory-failure" run_test ./memory-failure
-fi
-
-if [ -n "${LOADED_MOD}" ]; then
-       modprobe -r hwpoison_inject > /dev/null 2>&1
-fi
+CATEGORY="memory-failure" run_test ./memory-failure

  if [ "${HAVE_HUGEPAGES}" = 1 ]; then
        echo "$orig_nr_hugepgs" > /proc/sys/vm/nr_hugepages
--

Otherwise, LGTM.

Reviewed-by: Zi Yan <[email protected]>

Best Regards,
Yan, Zi


Reply via email to