summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-11-27 13:11:46 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2018-11-27 17:05:15 +0000
commit51aa13456993d38e7957946880f2695f48679c06 (patch)
tree6c339235ea627f92e955d910d35ea8224bb0bada
parenteae5c3587e56abc581af9b59060cd316df2caa08 (diff)
lib: Show stacktrace when terminated by runner
The igt_runner sends a SIGTERM to ask the test to cleanly exit upon an external timeout. It is useful to know what the code was doing when the timeout occurred, just in case it was unexpectedly stuck. However, since we use SIGTERM internally to marshal helper processes, we want to keep SIGTERM quiet, and so opt to use SIGQUIT for the timeout request instead. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Petri Latvala <petri.latvala@intel.com> Reviewed-by: Petri Latvala <petri.latvala@intel.com>
-rw-r--r--lib/igt_core.c27
-rw-r--r--runner/executor.c8
2 files changed, 25 insertions, 10 deletions
diff --git a/lib/igt_core.c b/lib/igt_core.c
index e0989f53..64883d64 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -1852,14 +1852,29 @@ static struct {
static igt_exit_handler_t exit_handler_fn[MAX_EXIT_HANDLERS];
static bool exit_handler_disabled;
+static const struct {
+ int number;
+ const char *name;
+ size_t name_len;
+} handled_signals[] = {
#define SIGDEF(x) { x, #x, sizeof(#x) - 1 }
#define SILENT(x) { x, NULL, 0 }
-static const struct { int number; const char *name; size_t name_len; } handled_signals[] =
- { SILENT(SIGINT), SILENT(SIGHUP), SILENT(SIGTERM), SILENT(SIGQUIT),
- SILENT(SIGPIPE), SIGDEF(SIGABRT), SIGDEF(SIGSEGV), SIGDEF(SIGBUS),
- SIGDEF(SIGFPE) };
+
+ SILENT(SIGINT),
+ SILENT(SIGHUP),
+ SILENT(SIGPIPE),
+ SILENT(SIGTERM),
+
+ SIGDEF(SIGQUIT), /* used by igt_runner for its external timeout */
+
+ SIGDEF(SIGABRT),
+ SIGDEF(SIGSEGV),
+ SIGDEF(SIGBUS),
+ SIGDEF(SIGFPE)
+
#undef SILENT
#undef SIGDEF
+};
static int install_sig_handler(int sig_num, sighandler_t handler)
{
@@ -1940,15 +1955,15 @@ static void fatal_sig_handler(int sig)
__write_stderr(handled_signals[i].name,
handled_signals[i].name_len);
write_stderr(".\n");
+
+ print_backtrace_sig_safe();
}
if (crash_signal(sig)) {
/* Linux standard to return exit code as 128 + signal */
if (!failed_one)
igt_exitcode = 128 + sig;
-
failed_one = true;
- print_backtrace_sig_safe();
if (in_subtest)
exit_subtest("CRASH");
diff --git a/runner/executor.c b/runner/executor.c
index a7d1f5f8..54c530b7 100644
--- a/runner/executor.c
+++ b/runner/executor.c
@@ -510,11 +510,11 @@ static int monitor_output(pid_t child,
switch (killed) {
case 0:
if (settings->log_level >= LOG_LEVEL_NORMAL) {
- printf("Timeout. Killing the current test with SIGTERM.\n");
+ printf("Timeout. Killing the current test with SIGQUIT.\n");
fflush(stdout);
}
- killed = SIGTERM;
+ killed = SIGQUIT;
if (!kill_child(killed, child))
return -1;
@@ -526,7 +526,7 @@ static int monitor_output(pid_t child,
watchdogs_set_timeout(120);
intervals_left = timeout_intervals = 1;
break;
- case SIGTERM:
+ case SIGQUIT:
if (settings->log_level >= LOG_LEVEL_NORMAL) {
printf("Timeout. Killing the current test with SIGKILL.\n");
fflush(stdout);
@@ -706,7 +706,7 @@ static int monitor_output(pid_t child,
aborting = true;
timeout = 2;
- killed = SIGTERM;
+ killed = SIGQUIT;
if (!kill_child(killed, child))
return -1;