[PATCH] selftests/proc: proc-empty-vm: wait for child's SIGSEGV instead of sleep(1)
From: Drif Abdelmalek Mohamed Said
Date: Fri Oct 23 2026 - 14:34:44 EST
The test had a TODO asking for a reliable way to know when the child's
munmap() has finished, and used sleep(1) in the meantime.
Unmapping the whole address space leaves the child with no code to run,
so it segfaults. Since it is traced, the SIGSEGV stop is reported to
the parent through waitpid(), which is exactly the signal the TODO
wanted. Wait for it there and drop the sleep and the TODO.
The stop is now consumed up front, so SIGKILL the child before the
final reap.
Fixes: 5bc73bb3451b ("proc: test how it holds up with mapping'less process")
Signed-off-by: Drif Abdelmalek Mohamed Said <drifabdelmalekmohamedsaid@xxxxxxxxx>
---
tools/testing/selftests/proc/proc-empty-vm.c | 24 ++++++++++++--------
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/tools/testing/selftests/proc/proc-empty-vm.c b/tools/testing/selftests/proc/proc-empty-vm.c
index b3f898aab4ab..cf65313a25f5 100644
--- a/tools/testing/selftests/proc/proc-empty-vm.c
+++ b/tools/testing/selftests/proc/proc-empty-vm.c
@@ -41,6 +41,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <signal.h>
#ifdef __amd64__
#define TEST_VSYSCALL
@@ -500,13 +501,18 @@ int main(void)
#endif
return EXIT_FAILURE;
} else {
- /*
- * TODO find reliable way to signal parent that munmap(2) completed.
- * Child can't do it directly because it effectively doesn't exist
- * anymore. Looking at child's VM files isn't 100% reliable either:
- * due to a bug they may not become empty or empty-like.
- */
- sleep(1);
+ int wstatus;
+ pid_t p;
+
+ for (;;) {
+ p = waitpid(pid, &wstatus, 0);
+ if (p == -1 && errno == EINTR)
+ continue;
+ break;
+ }
+ assert(p == pid);
+ assert(WIFSTOPPED(wstatus));
+ assert(WSTOPSIG(wstatus) == SIGSEGV);
if (rv == EXIT_SUCCESS) {
rv = test_proc_pid_maps(pid);
@@ -525,10 +531,8 @@ int main(void)
}
/* Cut the rope. */
- int wstatus;
+ kill(pid, SIGKILL);
waitpid(pid, &wstatus, 0);
- assert(WIFSTOPPED(wstatus));
- assert(WSTOPSIG(wstatus) == SIGSEGV);
}
return rv;
--
2.43.0