<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Feb 11, 2022 at 12:18 AM Martin Doucha <<a href="mailto:mdoucha@suse.cz">mdoucha@suse.cz</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">When the main test process crashes or gets killed e.g. by OOM killer,<br>
the watchdog process currently does not clean up any remaining child<br>
processes. Fix this by sending SIGKILL to the test process group when<br>
the watchdog process gets notified that the main test process has exited<br>
for any reason.<br></blockquote><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
--- a/lib/tst_test.c<br>
+++ b/lib/tst_test.c<br>
@@ -1399,6 +1399,13 @@ static void sigint_handler(int sig LTP_ATTRIBUTE_UNUSED)<br>
        }<br>
 }<br>
<br>
+static void sigchild_handler(int sig LTP_ATTRIBUTE_UNUSED)<br>
+{<br>
+       /* If the test process is dead, send SIGKILL to its children */<br>
+       if (kill(test_pid, 0))<br>
+               kill(-test_pid, SIGKILL);<br>
+}<br>
+<br>
 unsigned int tst_timeout_remaining(void)<br>
 {<br>
        static struct timespec now;<br>
@@ -1481,6 +1488,7 @@ static int fork_testrun(void)<br>
                tst_disable_oom_protection(0);<br>
                SAFE_SIGNAL(SIGALRM, SIG_DFL);<br>
                SAFE_SIGNAL(SIGUSR1, SIG_DFL);<br>
+               SAFE_SIGNAL(SIGCHLD, SIG_DFL);<br>
                SAFE_SIGNAL(SIGINT, SIG_DFL);<br>
                SAFE_SETPGID(0, 0);<br>
                testrun();<br>
@@ -1560,6 +1568,7 @@ void tst_run_tcases(int argc, char *argv[], struct tst_test *self)<br>
<br>
        SAFE_SIGNAL(SIGALRM, alarm_handler);<br>
        SAFE_SIGNAL(SIGUSR1, heartbeat_handler);<br>
+       SAFE_SIGNAL(SIGCHLD, sigchild_handler);<br></blockquote><div><br></div><div class="gmail_default" style="font-size:small">Do we really need setup this signal handler for SIGCHILD?</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">Since we have already called 'SAFE_WAITPID(test_pid, &status, 0)'</div><div class="gmail_default" style="font-size:small">in the library process (lib_pid) which rely on SIGCHILD as well.</div><div class="gmail_default" style="font-size:small">And even this handler will be called everytime when test exit normally.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">Maybe better just add a kill function to cleanup the remain</div><div class="gmail_default" style="font-size:small">descendants if main test process exit with abonormal status.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">e.g.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">--- a/lib/tst_test.c<br>+++ b/lib/tst_test.c<br>@@ -1503,6 +1503,8 @@ static int fork_testrun(void)<br>        if (WIFEXITED(status) && WEXITSTATUS(status))<br>                return WEXITSTATUS(status);<br> <br>+       kill(-test_pid, SIGKILL);<br>+<br>        if (WIFSIGNALED(status) && WTERMSIG(status) == SIGKILL) {<br>                tst_res(TINFO, "If you are running on slow machine, "<br>                               "try exporting LTP_TIMEOUT_MUL > 1");<br></div></div><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>