@@ -567,6 +567,7 @@ cmd_update(int argc, char *argv[])
567567
568568#ifdef STRESS_TEST
569569
570+ int parent_pid = -1 ;
570571static int process_pid = -1 ;
571572static char test_log_base [PATH_MAX - sizeof ("-4194304" )];
572573static char test_log_name [PATH_MAX ];
@@ -647,16 +648,53 @@ static int stress_test_log_init(int is_base_process)
647648 return 0 ;
648649}
649650
651+ void stress_test_notify_parent ()
652+ {
653+ if (parent_pid < 0 )
654+ return ;
655+ union sigval code ;
656+ code .sival_int = process_pid ;
657+ sigqueue (parent_pid , SIGCHLD , code );
658+ }
659+
660+ void stress_test_signal_handler (int sig , siginfo_t * info , void * ucontext )
661+ {
662+ switch (sig ) {
663+ case SIGCHLD : {
664+ if (info -> si_code == SI_QUEUE ) {
665+ kpinfo ("Child process pid %d fatal error.\n" , info -> si_pid );
666+ return ;
667+ } else {
668+ int pid , status ;
669+ while ((pid = waitpid (-1 , & status , WNOHANG )) > 0 )
670+ kpinfo ("Process pid %d exited.\n" , pid );
671+ return ;
672+ }
673+ break ;
674+ }
675+ }
676+ }
677+
678+ void stress_test_install_sigaction ()
679+ {
680+ struct sigaction sigact ;
681+ sigemptyset (& sigact .sa_mask );
682+ sigact .sa_flags = SA_SIGINFO | SA_RESTART ;
683+ sigact .sa_sigaction = & stress_test_signal_handler ;
684+ sigaction (SIGCHLD , & sigact , NULL );
685+ }
686+
650687static int cmd_stress_test (int fd , int argc , char * argv [])
651688{
652689 if (sscanf (argv [1 ], "%d" , & process_pid ) != 1 ) {
653690 kplogerror ("Can't parse pid from %s\n" , argv [1 ]);
654691 return -1 ;
655692 }
656- kpinfo ("Spawning child to patch pid %d\n" , process_pid );
657693
694+ parent_pid = getpid ();
658695 int child = fork ();
659696 if (child == 0 ) {
697+ signal (SIGCHLD , SIG_DFL );
660698 log_file_free ();
661699 if (stress_test_log_init (0 ))
662700 kpfatal ("Can't initialize log.\n" );
@@ -666,6 +704,7 @@ static int cmd_stress_test(int fd, int argc, char *argv[])
666704 log_file_free ();
667705 exit (rv );
668706 }
707+ kpinfo ("Spawned child %d to patch pid %d\n" , child , process_pid );
669708 close (fd );
670709 return 0 ;
671710}
@@ -1020,7 +1059,8 @@ int main(int argc, char *argv[])
10201059#ifdef STRESS_TEST
10211060 if (argc < 3 )
10221061 return usage ("not enough arguments." );
1023- signal (SIGCHLD , SIG_IGN );
1062+
1063+ stress_test_install_sigaction ();
10241064 return cmd_server (argc , argv );
10251065#else
10261066 if (argc < 1 )
0 commit comments