diff options
author | Petri Latvala <petri.latvala@intel.com> | 2020-01-28 13:48:01 +0200 |
---|---|---|
committer | Petri Latvala <petri.latvala@intel.com> | 2020-01-29 15:40:24 +0200 |
commit | 01c38bb14543e176b72a26fd8a2509dc300b8adf (patch) | |
tree | 496c8b9b35bc8fc04df1e82ef6415d914ed5815f /runner | |
parent | ccefe6bf07b075f786d96904e19eaa03695c26d5 (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.c | 45 |
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; |