Fix stress runner signal related issues

The stress runner with -S option needs to stop all workers on error.

* The workers which terminated successfully (0) must be distinguished
  orm the failed workers, and the successfully terminated workers
  MUST not cause mass termination.
* The SIGCHLD single does not needs to be handled anymore when we terminate all
  workers.
* Does not makes sens to handle again and again, the SIGCHLD signal after
  any worker finished with failure.

Change-Id: Ic563f3acaa4e56f5135c438612f1db990b858552
diff --git a/tempest/stress/driver.py b/tempest/stress/driver.py
index 9660081..25ae27f 100644
--- a/tempest/stress/driver.py
+++ b/tempest/stress/driver.py
@@ -80,11 +80,16 @@
     return ret
 
 
-def sigchld_handler(signal, frame):
+def sigchld_handler(signalnum, frame):
     """
     Signal handler (only active if stop_on_error is True).
     """
-    terminate_all_processes()
+    for process in processes:
+        if (not process['process'].is_alive() and
+                process['process'].exitcode != 0):
+            signal.signal(signalnum, signal.SIG_DFL)
+            terminate_all_processes()
+            break
 
 
 def terminate_all_processes(check_interval=20):
@@ -202,6 +207,8 @@
             had_errors = True
             break
 
+    if stop_on_error:
+        signal.signal(signal.SIGCHLD, signal.SIG_DFL)
     terminate_all_processes()
 
     sum_fails = 0