Re: [PATCH v3 12/13] selftests/mm: move hwpoison setup into run_test() and silence modprobe output for memory-failure category

From: Sayali Patil

Date: Thu Apr 02 2026 - 03:27:09 EST




On 27/03/26 12:46, 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.

Fixes: ff4ef2fbd101 ("selftests/mm: add memory failure anonymous page test")
Acked-by: Zi Yan <ziy@xxxxxxxxxx>
Acked-by: Miaohe Lin <linmiaohe@xxxxxxxxxx>
Tested-by: Venkat Rao Bagalkote <venkat88@xxxxxxxxxxxxx>
Signed-off-by: Sayali Patil <sayalip@xxxxxxxxxxxxx>
---
tools/testing/selftests/mm/run_vmtests.sh | 46 ++++++++++++++---------
1 file changed, 28 insertions(+), 18 deletions(-)

diff --git a/tools/testing/selftests/mm/run_vmtests.sh b/tools/testing/selftests/mm/run_vmtests.sh
index eecec0b6eb13..606558cc3b09 100755
--- a/tools/testing/selftests/mm/run_vmtests.sh
+++ b/tools/testing/selftests/mm/run_vmtests.sh
@@ -250,6 +250,27 @@ 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
+ fi
+ fi
+
+ if [ ! -d "$HWPOISON_DIR" ]; then
+ echo "hwpoison debugfs interface not present" | tap_prefix
+ skip=1
+ fi
+ fi
+
local test=$(pretty_name "$*")
local title="running $*"
local sep=$(echo -n "$title" | tr "[:graph:][:space:]" -)
@@ -261,6 +282,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 ))
@@ -540,24 +567,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

AI review question:
> diff --git a/tools/testing/selftests/mm/run_vmtests.sh
> b/tools/testing/selftests/mm/run_vmtests.sh
> --- a/tools/testing/selftests/mm/run_vmtests.sh
> +++ b/tools/testing/selftests/mm/run_vmtests.sh
> @@ -250,6 +250,27 @@ 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
Does moving this skip logic inside run_test() mask previous test failures?
The run_vmtests.sh script sets exitcode=$ksft_skip when a test skips.
Previously, if the module was missing, the script bypassed calling run_test()
for memory-failure entirely, which preserved any previous failure exit code.
With this patch, run_test() executes, skips internally, and sets the
exitcode to 4. Since memory-failure is the final test, could this
change the test
suite's final exit code from 1 to 4 on systems without the module?


This was pre-existing behavior, however, the concern is valid. Failures should take precedence over skips. Let me address this in v4.


> + else
> + modprobe hwpoison_inject > /dev/null 2>&1
> + LOADED_MOD=1
Should LOADED_MOD be declared as a local variable here?
Since it lacks a local declaration, it persists in the script's global
environment. If any tests are appended after memory-failure in the future,
or if LOADED_MOD is already set in the user's environment, this could cause
modprobe -r hwpoison_inject to execute redundantly after those tests.


Yes, good point. Let me address this in v4 by making it a local variable.


> + fi
> + fi
> +
> + if [ ! -d "$HWPOISON_DIR" ]; then
> + echo "hwpoison debugfs interface not present" | tap_prefix
> + skip=1
> + fi
Will this print a redundant skip message when the module is not found?
If modprobe -n fails earlier, the directory will still be absent, causing
this second block to evaluate to true. This prints hwpoison debugfs interface
not present right after Module hwpoison_inject not found, skipping...,
which might contradict the goal of keeping the selftest logs clean.


Agreed, this can lead to redundant output. I’ll update it in v4 to avoid the duplicate skip message.