When listns() is not implemented the iterator child detects ENOSYS and
exits cleanly with status PIDFD_SKIP before the parent has a chance to
signal it.  The parent sends SIGKILL (which is a harmless no-op at that
point) and then calls waitpid(), obtaining a normal-exit status.  The
subsequent ASSERT_TRUE(WIFSIGNALED(status)) therefore fails, causing the
three EFAULT-focused tests to report FAIL rather than SKIP on kernels that
do not yet carry listns() support.

After collecting the iterator's exit status, check whether it exited with
PIDFD_SKIP and issue a SKIP verdict in that case, consistent with the
behaviour of every other listns test that already handles ENOSYS correctly.

Signed-off-by: Ricardo B. Marlière <[email protected]>
---
 .../testing/selftests/namespaces/listns_efault_test.c  | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/tools/testing/selftests/namespaces/listns_efault_test.c 
b/tools/testing/selftests/namespaces/listns_efault_test.c
index ac3b208264f5..c20c6a812217 100644
--- a/tools/testing/selftests/namespaces/listns_efault_test.c
+++ b/tools/testing/selftests/namespaces/listns_efault_test.c
@@ -177,6 +177,12 @@ TEST(listns_partial_fault_with_ns_cleanup)
        ASSERT_EQ(ret, iter_pid);
        close(iter_pidfd);
 
+       /* If listns() is not supported the iterator exits cleanly via ENOSYS */
+       if (WIFEXITED(status) && WEXITSTATUS(status) == PIDFD_SKIP) {
+               munmap(map, page_size);
+               SKIP(return, "listns() not supported");
+       }
+
        /* Should have been killed */
        ASSERT_TRUE(WIFSIGNALED(status));
        ASSERT_EQ(WTERMSIG(status), SIGKILL);
@@ -387,6 +393,12 @@ TEST(listns_late_fault_with_ns_cleanup)
        ASSERT_EQ(ret, iter_pid);
        close(iter_pidfd);
 
+       /* If listns() is not supported the iterator exits cleanly via ENOSYS */
+       if (WIFEXITED(status) && WEXITSTATUS(status) == PIDFD_SKIP) {
+               munmap(map, page_size);
+               SKIP(return, "listns() not supported");
+       }
+
        /* Should have been killed */
        ASSERT_TRUE(WIFSIGNALED(status));
        ASSERT_EQ(WTERMSIG(status), SIGKILL);
@@ -523,6 +535,12 @@ TEST(listns_mnt_ns_cleanup_on_fault)
        ASSERT_EQ(ret, iter_pid);
        close(iter_pidfd);
 
+       /* If listns() is not supported the iterator exits cleanly via ENOSYS */
+       if (WIFEXITED(status) && WEXITSTATUS(status) == PIDFD_SKIP) {
+               munmap(map, page_size);
+               SKIP(return, "listns() not supported");
+       }
+
        /* Should have been killed */
        ASSERT_TRUE(WIFSIGNALED(status));
        ASSERT_EQ(WTERMSIG(status), SIGKILL);

-- 
2.53.0


Reply via email to