[CRIU] [PATCH v3 45/55] ns: Add usernsd signal handler

Kirill Tkhai ktkhai at virtuozzo.com
Tue Apr 25 05:14:33 PDT 2017


On 25.04.2017 08:34, Andrei Vagin wrote:
> Could you explain in each commit message why we need these changes and
> what they do?

ns: Add usernsd signal handler

Handler to catch exited children of usernsd.
This will be used in next patches to watch
for pid_ns helpers exit.

v3: pr_err() -> pr_info()
v2: New

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>

> 
> On Mon, Apr 10, 2017 at 11:22:33AM +0300, Kirill Tkhai wrote:
>> v3: pr_err() -> pr_info()
>> v2: New
>>
>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>> ---
>>  criu/namespaces.c |   34 ++++++++++++++++++++++++++++++++++
>>  1 file changed, 34 insertions(+)
>>
>> diff --git a/criu/namespaces.c b/criu/namespaces.c
>> index 3562f9a2a..8bc876465 100644
>> --- a/criu/namespaces.c
>> +++ b/criu/namespaces.c
>> @@ -14,6 +14,7 @@
>>  #include <limits.h>
>>  #include <errno.h>
>>  #include <sys/ioctl.h>
>> +#include <sys/ptrace.h>
>>  
>>  #include "page.h"
>>  #include "rst-malloc.h"
>> @@ -24,6 +25,7 @@
>>  #include "mount.h"
>>  #include "pstree.h"
>>  #include "namespaces.h"
>> +#include "restore.h"
>>  #include "net.h"
>>  #include "cgroup.h"
>>  #include "kerndat.h"
>> @@ -1508,6 +1510,33 @@ static void unsc_msg_pid_fd(struct unsc_msg *um, pid_t *pid, int *fd)
>>  	}
>>  }
>>  
>> +static void usernsd_handler(int signal, siginfo_t *siginfo, void *data)
>> +{
>> +	pid_t pid = siginfo->si_pid;
>> +	int status;
>> +	int exit;
>> +
>> +	if (siginfo->si_code == CLD_TRAPPED && siginfo->si_status == SIGCHLD) {
>> +		/* The usernsd is ptraced. Allow it to handle SIGCHLD */
>> +		ptrace(PTRACE_CONT, siginfo->si_pid, 0, SIGCHLD);
> 
> Who ptraces usernsd? Signals can be merged, so you have to user wait4 to
> get all pids?
>> +		return;
>> +	}
>> +
>> +	while (pid) {
>> +		pid = waitpid(-1, &status, WNOHANG);
>> +		if (pid <= 0)
>> +			return;
>> +
>> +		exit = WIFEXITED(status);
>> +		status = exit ? WEXITSTATUS(status) : WTERMSIG(status);
>> +		if (status) {
>> +			futex_abort_and_wake(&task_entries->nr_in_progress);
>> +			pr_err("%d finished abnormal\n", pid);
>> +		} else
>> +			pr_info("%d exited normally\n", pid);
>> +	}
>> +}
>> +
>>  static int usernsd(int sk)
>>  {
>>  	struct sockaddr_un addr;
>> @@ -1537,6 +1566,11 @@ static int usernsd(int sk)
>>  		return -1;
>>  	}
>>  
>> +	if (criu_signals_setup(usernsd_handler) < 0) {
>> +		pr_err("Can't setup handler\n");
>> +		return -1;
>> +	}
>> +
>>  	while (1) {
>>  		struct unsc_msg um;
>>  		static char msg[MAX_UNSFD_MSG_SIZE];
>>


More information about the CRIU mailing list