[CRIU] [PATCH v2] zdtm: Fix fd01 cleanup

Kirill Tkhai ktkhai at virtuozzo.com
Thu Feb 1 17:54:12 MSK 2018


zdtm: Fix fd01 cleanup

From: Kirill Tkhai <ktkhai at virtuozzo.com>

waitpid() does not return child pid, when child has not exited.
So, we can't use it to find pids of children.

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 test/zdtm/static/fd01.c |   19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/test/zdtm/static/fd01.c b/test/zdtm/static/fd01.c
index 7f0256a03..4e7875110 100644
--- a/test/zdtm/static/fd01.c
+++ b/test/zdtm/static/fd01.c
@@ -22,11 +22,19 @@ int main(int argc, char **argv)
 	unsigned int i, max_nr, flags;
 	int fd, status, ret;
 	struct rlimit rlim;
+	futex_t *futex;
 	char buf[16];
 	pid_t pid;
 
 	test_init(argc, argv);
 
+	futex = mmap(NULL, sizeof(*futex), PROT_WRITE | PROT_READ, MAP_ANONYMOUS|MAP_SHARED, -1, 0);
+	if (futex == MAP_FAILED) {
+		fail("mmap");
+		exit(1);
+	}
+	futex_init(futex);
+
 	fd = open("/proc/sys/fs/nr_open", O_RDONLY);
 	if (fd < 0) {
 		fail("Can't open /proc/sys/fs/nr_open");
@@ -86,7 +94,7 @@ int main(int argc, char **argv)
 			fail("fork");
 			exit(1);
 		} else if (!pid) {
-			pause();
+			futex_wait_while(futex, 0);
 			exit(0);
 		}
 	}
@@ -95,9 +103,12 @@ int main(int argc, char **argv)
 	test_waitsig();
 
 	/* Cleanup */
-	while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
-		if (kill(pid, SIGTERM) == 0)
-			waitpid(-1, &status, 0); /* Ignore errors */
+	futex_set_and_wake(futex, 1);
+	while (wait(&status) > 0) {
+		if (!WIFEXITED(status) || WEXITSTATUS(status)) {
+			fail("Wrong exit status: %d", status);
+			exit(1);
+		}
 	}
 
 	pass();


More information about the CRIU mailing list