All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] Wait for any pid in order to reap failure quicker
@ 2014-07-11  9:40 Chris Wilson
  2014-07-11  9:40 ` [PATCH 2/3] igt/gem_userptr_blits: Shared memory allocations Chris Wilson
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Chris Wilson @ 2014-07-11  9:40 UTC (permalink / raw)
  To: intel-gfx

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@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

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-07-11 11:56 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-11  9:40 [PATCH 1/3] Wait for any pid in order to reap failure quicker Chris Wilson
2014-07-11  9:40 ` [PATCH 2/3] igt/gem_userptr_blits: Shared memory allocations Chris Wilson
2014-07-11 10:30   ` Tvrtko Ursulin
2014-07-11  9:40 ` [PATCH 3/3] igt/gem_userptr_blits: Verify that userptr bo work on unshared memory Chris Wilson
2014-07-11 10:45   ` Tvrtko Ursulin
2014-07-11 11:56 ` [PATCH 1/3] Wait for any pid in order to reap failure quicker Tvrtko Ursulin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.