Re: [igt-dev] [PATCH i-g-t] runner: Make sure output is still collected when killing test due to taint

Chris Wilson
2020-01-28T12:01:30Z

Quoting Petri Latvala (2020-01-28 11:48:01)
> 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>
> ---
> runner/executor.c | 45 +++++++++++++++++++++++++++++----------------
> 1 file 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;

Ok, that seems to be equivalent to what went before (the attempt to
suppress show_kernel_task_state()), with the new feature of killing if we
ever wake up and see the system tainted (for the first time).

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
-Chris