[Intel-gfx] [PATCH 1/3] Wait for any pid in order to reap failure quicker

Chris Wilson chris at chris-wilson.co.uk
Fri Jul 11 11:40:38 CEST 2014


When waiting for the forked tests, we can respond quicker to a failure
(such as oom) by waiting for any child to exit rather than waiting for
each child in order. Then when we see that a test failed, we can kill
all other children before aborting.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 lib/igt_core.c | 42 +++++++++++++++++++++++++++++++-----------
 1 file changed, 31 insertions(+), 11 deletions(-)

diff --git a/lib/igt_core.c b/lib/igt_core.c
index 7ac7ebe..e5dc78b 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -915,32 +915,52 @@ bool __igt_fork(void)
  */
 void igt_waitchildren(void)
 {
+	int err = 0;
+	int count;
+
 	assert(!test_child);
 
-	for (int nc = 0; nc < num_test_children; nc++) {
+	count = 0;
+	while (count < num_test_children) {
 		int status = -1;
-		while (waitpid(test_children[nc], &status, 0) == -1 &&
-		       errno == EINTR)
-			;
+		pid_t pid;
+		int c;
 
-		if (status != 0) {
+		pid = wait(&status);
+		if (pid == -1)
+			continue;
+
+		for (c = 0; c < num_test_children; c++)
+			if (pid == test_children[c])
+				break;
+		if (c == num_test_children)
+			continue;
+
+		if (err == 0 && status != 0) {
 			if (WIFEXITED(status)) {
 				printf("child %i failed with exit status %i\n",
-				       nc, WEXITSTATUS(status));
-				igt_fail(WEXITSTATUS(status));
+				       c, WEXITSTATUS(status));
+				err = WEXITSTATUS(status);
 			} else if (WIFSIGNALED(status)) {
 				printf("child %i died with signal %i, %s\n",
-				       nc, WTERMSIG(status),
+				       c, WTERMSIG(status),
 				       strsignal(WTERMSIG(status)));
-				igt_fail(99);
+				err = 128 + WTERMSIG(status);
 			} else {
-				printf("Unhandled failure in child %i\n", nc);
-				abort();
+				printf("Unhandled failure [%d] in child %i\n", status, c);
+				err = 256;
 			}
+
+			for (c = 0; c < num_test_children; c++)
+				kill(test_children[c], SIGKILL);
 		}
+
+		count++;
 	}
 
 	num_test_children = 0;
+	if (err)
+		igt_fail(err);
 }
 
 /* exit handler code */
-- 
2.0.1




More information about the Intel-gfx mailing list