[CRIU] [PATCH] restore: simplify sigchld handler

Andrei Vagin avagin at openvz.org
Fri May 12 17:11:19 PDT 2017


From: Andrei Vagin <avagin at virtuozzo.com>

The idea is simple. Everyone has to wait its children,
a restore is interrupted if we found abandoned zombie.

Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
---
 criu/cr-restore.c | 46 +++++++++-------------------------------------
 1 file changed, 9 insertions(+), 37 deletions(-)

diff --git a/criu/cr-restore.c b/criu/cr-restore.c
index 9da6d72..e0d4c59 100644
--- a/criu/cr-restore.c
+++ b/criu/cr-restore.c
@@ -1412,54 +1412,26 @@ err:
 
 static void sigchld_handler(int signal, siginfo_t *siginfo, void *data)
 {
-	struct pstree_item *pi;
-	pid_t pid = siginfo->si_pid;
-	int status;
-	int exit;
-
-	exit = (siginfo->si_code == CLD_EXITED);
-	status = siginfo->si_status;
+	int status, pid, exit;
 
-	/* skip scripts */
-	if (!current && root_item->pid->real != pid) {
-		pid = waitpid(root_item->pid->real, &status, WNOHANG);
+	while (1) {
+		pid = waitpid(-1, &status, WNOHANG);
 		if (pid <= 0)
 			return;
-		exit = WIFEXITED(status);
-		status = exit ? WEXITSTATUS(status) : WTERMSIG(status);
-	}
-
-	if (!current && siginfo->si_code == CLD_TRAPPED &&
-				siginfo->si_status == SIGCHLD) {
-		/* The root task is ptraced. Allow it to handle SIGCHLD */
-		ptrace(PTRACE_CONT, siginfo->si_pid, 0, SIGCHLD);
-		return;
-	}
 
-	if (!current || status)
-		goto err;
-
-	while (pid) {
-		pid = waitpid(-1, &status, WNOHANG);
-		if (pid <= 0)
+		if (!current && WIFSTOPPED(status) &&
+					WSTOPSIG(status) == SIGCHLD) {
+			/* The root task is ptraced. Allow it to handle SIGCHLD */
+			ptrace(PTRACE_CONT, siginfo->si_pid, 0, SIGCHLD);
 			return;
+		}
 
 		exit = WIFEXITED(status);
 		status = exit ? WEXITSTATUS(status) : WTERMSIG(status);
-		if (status)
-			break;
-
-		/* Exited (with zero code) helpers are OK */
-		list_for_each_entry(pi, &current->children, sibling)
-			if (vpid(pi) == siginfo->si_pid)
-				break;
 
-		BUG_ON(&pi->sibling == &current->children);
-		if (pi->pid->state != TASK_HELPER)
-			break;
+		break;
 	}
 
-err:
 	if (exit)
 		pr_err("%d exited, status=%d\n", pid, status);
 	else
-- 
2.9.3



More information about the CRIU mailing list