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

Sayali Patil
2026-04-08T08:36:49Z

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 <sayalip@linux.ibm.com>
>> ---
>> 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 <ziy@nvidia.com>
>
> Best Regards,
> Yan, Zi