Commit 8b669588 authored by Breno Leitao's avatar Breno Leitao Committed by Kleber Sacilotto de Souza

selftests/powerpc: Kill child processes on SIGINT

BugLink: https://bugs.launchpad.net/bugs/1797563

[ Upstream commit 7c27a26e ]

There are some powerpc selftests, as tm/tm-unavailable, that run for a long
period (>120 seconds), and if it is interrupted, as pressing CRTL-C
(SIGINT), the foreground process (harness) dies but the child process and
threads continue to execute (with PPID = 1 now) in background.

In this case, you'd think the whole test exited, but there are remaining
threads and processes being executed in background. Sometimes these
zombies processes are doing annoying things, as consuming the whole CPU or
dumping things to STDOUT.

This patch fixes this problem by attaching an empty signal handler to
SIGINT in the harness process. This handler will interrupt (EINTR) the
parent process waitpid() call, letting the code to follow through the
normal flow, which will kill all the processes in the child process group.

This patch also fixes a typo.
Signed-off-by: default avatarBreno Leitao <leitao@debian.org>
Signed-off-by: default avatarGustavo Romero <gromero@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarStefan Bader <stefan.bader@canonical.com>
Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
parent faf1d3aa
......@@ -85,13 +85,13 @@ int run_test(int (test_function)(void), char *name)
return status;
}
static void alarm_handler(int signum)
static void sig_handler(int signum)
{
/* Jut wake us up from waitpid */
/* Just wake us up from waitpid */
}
static struct sigaction alarm_action = {
.sa_handler = alarm_handler,
static struct sigaction sig_action = {
.sa_handler = sig_handler,
};
int test_harness(int (test_function)(void), char *name)
......@@ -101,8 +101,14 @@ int test_harness(int (test_function)(void), char *name)
test_start(name);
test_set_git_version(GIT_VERSION);
if (sigaction(SIGALRM, &alarm_action, NULL)) {
perror("sigaction");
if (sigaction(SIGINT, &sig_action, NULL)) {
perror("sigaction (sigint)");
test_error(name);
return 1;
}
if (sigaction(SIGALRM, &sig_action, NULL)) {
perror("sigaction (sigalrm)");
test_error(name);
return 1;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment