[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