From: Thomas Weißschuh thomas.weissschuh@linutronix.de
[ Upstream commit 1158220b24674edaf885433153deb4f0e5c7d331 ]
The TAP specification requires that the output begins with a header line. If vgetrandom_init() fails and skips the test, that header line is missing.
Call vgetrandom_init() after ksft_print_header().
Signed-off-by: Thomas Weißschuh thomas.weissschuh@linutronix.de Signed-off-by: Thomas Gleixner tglx@linutronix.de Reviewed-by: Muhammad Usama Anjum usama.anjum@collabora.com Link: https://lore.kernel.org/all/20250611-selftests-vdso-fixes-v3-8-e62e37a6bcf5@... Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
**Backport Status: YES**
This commit should be backported to stable kernel trees. Here's my extensive analysis:
## Analysis of the Commit
### 1. Bug Description The commit fixes a test output formatting bug in the vDSO getrandom selftest. Looking at the code changes in `tools/testing/selftests/vDSO/vdso_test_getrandom.c`:
**Before the fix (lines 239-245 and 296-298 in the original file):** ```c static void kselftest(void) { // ... variables ... ksft_print_header(); ksft_set_plan(2); // ... test code ... }
int main(int argc, char *argv[]) { vgetrandom_init(); // This was called BEFORE ksft_print_header()
if (argc == 1) { kselftest(); return 0; } // ... } ```
**After the fix:** ```c static void kselftest(void) { // ... variables ... ksft_print_header(); vgetrandom_init(); // Moved AFTER ksft_print_header() ksft_set_plan(2); // ... test code ... }
int main(int argc, char *argv[]) { if (argc == 1) { kselftest(); return 0; }
// ... vgetrandom_init(); // Called here for non-test modes // ... } ```
### 2. Why This is a Bug
The TAP (Test Anything Protocol) specification requires that test output begins with a version header line (`TAP version 13`). The `ksft_print_header()` function prints this required header.
Looking at `vgetrandom_init()` (lines 113-131), it contains multiple `ksft_exit_skip()` calls that can terminate the test early: - Line 121: If `AT_SYSINFO_EHDR` is not present - Line 125: If the vDSO symbol is missing - Line 128: If the CPU doesn't have runtime support
When `vgetrandom_init()` was called before `ksft_print_header()`, these skip conditions would exit the test without printing the TAP header, violating the TAP specification and potentially breaking test harnesses that parse the output.
### 3. Stable Backport Criteria Assessment
✓ **Fixes a bug that affects users**: Yes, this fixes incorrect test output that can break automated test systems and CI/CD pipelines that parse TAP output.
✓ **Relatively small and contained**: Yes, the fix is minimal - it just reorders two function calls to ensure proper TAP header output.
✓ **No major side effects**: The change only affects test output ordering, not functionality. The test logic remains identical.
✓ **No architectural changes**: This is a simple reordering of existing calls with no structural changes.
✓ **Minimal risk**: The change is confined to the selftest code and cannot affect kernel runtime behavior.
✓ **Important for testing infrastructure**: Correct TAP output is crucial for test automation systems used in continuous integration and validation of stable kernels.
### 4. Additional Considerations
- The commit message clearly describes the problem and solution - The fix follows established kselftest patterns (header before any potential exits) - This is a test-only change with zero impact on production kernel code - The bug could cause false test results in automated systems that expect valid TAP output
This is an ideal candidate for stable backporting as it fixes a real bug in test infrastructure with minimal risk and clear benefits for kernel testing and validation.
tools/testing/selftests/vDSO/vdso_test_getrandom.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/vDSO/vdso_test_getrandom.c b/tools/testing/selftests/vDSO/vdso_test_getrandom.c index 95057f7567db..ff8d5675da2b 100644 --- a/tools/testing/selftests/vDSO/vdso_test_getrandom.c +++ b/tools/testing/selftests/vDSO/vdso_test_getrandom.c @@ -242,6 +242,7 @@ static void kselftest(void) pid_t child;
ksft_print_header(); + vgetrandom_init(); ksft_set_plan(2);
for (size_t i = 0; i < 1000; ++i) { @@ -295,8 +296,6 @@ static void usage(const char *argv0)
int main(int argc, char *argv[]) { - vgetrandom_init(); - if (argc == 1) { kselftest(); return 0; @@ -306,6 +305,9 @@ int main(int argc, char *argv[]) usage(argv[0]); return 1; } + + vgetrandom_init(); + if (!strcmp(argv[1], "bench-single")) bench_single(); else if (!strcmp(argv[1], "bench-multi"))