forked from Minki/linux
selftests/powerpc: Kill child processes on SIGINT
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: Breno Leitao <leitao@debian.org> Signed-off-by: Gustavo Romero <gromero@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
77b5f703dc
commit
7c27a26e1e
@ -85,13 +85,13 @@ wait:
|
||||
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,
|
||||
};
|
||||
|
||||
void test_harness_set_timeout(uint64_t time)
|
||||
@ -106,8 +106,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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user