summaryrefslogtreecommitdiff
path: root/runner
diff options
context:
space:
mode:
authorPetri Latvala <petri.latvala@intel.com>2020-01-28 13:48:01 +0200
committerPetri Latvala <petri.latvala@intel.com>2020-01-29 15:40:24 +0200
commit01c38bb14543e176b72a26fd8a2509dc300b8adf (patch)
tree496c8b9b35bc8fc04df1e82ef6415d914ed5815f /runner
parentccefe6bf07b075f786d96904e19eaa03695c26d5 (diff)
runner: Make sure output is still collected when killing test due to taint
If the kernel is tainted, it stays tainted, so make sure the execution monitoring still reaches the output collectors and other fd change handlers. Reported-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Petri Latvala <petri.latvala@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'runner')
-rw-r--r--runner/executor.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/runner/executor.c b/runner/executor.c
index 0927d1fd..ca9a12e3 100644
--- a/runner/executor.c
+++ b/runner/executor.c
@@ -759,28 +759,41 @@ static int monitor_output(pid_t child,
return -1;
}
- if (settings->abort_mask & ABORT_TAINT && tainted(&taints)) /* cancel children after a kernel OOPS */
- n = 0, intervals_left = 1;
+ /*
+ * If we're configured to care about taints, kill the
+ * test if there's a taint. But only if we didn't
+ * already kill it, and make sure we still process the
+ * fds select() marked for us.
+ */
+ if (settings->abort_mask & ABORT_TAINT &&
+ tainted(&taints) &&
+ killed == 0) {
+ if (settings->log_level >= LOG_LEVEL_NORMAL) {
+ outf("Killing the test because the kernel is tainted.\n");
+ fflush(stdout);
+ }
- if (n == 0) {
+ killed = SIGQUIT;
+ if (!kill_child(killed, child))
+ return -1;
+
+ /*
+ * Now continue the loop and let the
+ * dying child be handled normally.
+ */
+ timeout = 20;
+ watchdogs_set_timeout(120);
+ intervals_left = timeout_intervals = 1;
+ } else if (n == 0) {
if (--intervals_left)
continue;
switch (killed) {
case 0:
- /* If abort_mask doesn't have taint set, taints is still 0 here */
- if (!is_tainted(taints)) {
- show_kernel_task_state();
- if (settings->log_level >= LOG_LEVEL_NORMAL) {
- outf("Timeout. Killing the current test with SIGQUIT.\n");
-
- fflush(stdout);
- }
- } else {
- if (settings->log_level >= LOG_LEVEL_NORMAL) {
- outf("Killing the test because the kernel is tainted.\n");
- fflush(stdout);
- }
+ show_kernel_task_state();
+ if (settings->log_level >= LOG_LEVEL_NORMAL) {
+ outf("Timeout. Killing the current test with SIGQUIT.\n");
+ fflush(stdout);
}
killed = SIGQUIT;