[CRIU] [net_ns] Problem of restoring tun in nested net namespace

Andrew Vagin avagin at virtuozzo.com
Thu Apr 6 10:28:08 PDT 2017


On Fri, Mar 24, 2017 at 05:06:23PM +0300, Kirill Tkhai wrote:
> Hi, Andrew,
> 
> there is a problem with restoring tun device in root net ns, when a child net ns exists.
> This problem is related to net_ns only, and the below patch shows how to reproduce it.
> 
> 1) Fast investigation shows, that tun restored in net ns of pid=16632 on diagram (i.e., NS_CRIU):
> 16615 pts/2    S+     0:00  |   |           \_ python2 ./test/zdtm.py run -t zdtm/static/tun
> 16627 pts/2    S+     0:00  |   |               \_ ./zdtm_ct zdtm.py
> 16628 pts/2    S+     0:00  |   |                   \_ python2 zdtm.py
> 16632 pts/2    S+     0:00  |   |                       \_ python2 zdtm.py
> 16726 ?        Ss     0:00  |   |                       \_ ./tun --pidfile=tun.pid --outfile=tun.out
> 16749 ?        Ss     0:00  |   |                           \_ ./tun --pidfile=tun.pid --outfile=tun.out
> 16750 ?        S      0:00  |   |                               \_ ./tun --pidfile=tun.pid --outfile=tun.out
> 
> 2)I added noauto to this test to prevent crappy travis reports. Please, run the test manually.
> 
> 3)Test should fails like the below:
> 14:04:21.671:     5: FAIL: tun.c:267: Address mismatch on tap 4a:ffffffa9 -> ffffffa6:fffffff6 (errno = 16 (Device or resource busy))

The problem is that we need to restore tun file descriptros in proper
namespaces. Will fix. Thanks!

> 
> Kirill
> 
> ---
> diff --git a/test/zdtm/static/tun.c b/test/zdtm/static/tun.c
> index c53b8fa8..4543b148 100644
> --- a/test/zdtm/static/tun.c
> +++ b/test/zdtm/static/tun.c
> @@ -1,3 +1,19 @@
> +#define _GNU_SOURCE
> +#include <sched.h>
> +#include <stdbool.h>
> +#include <string.h>
> +#include <fcntl.h>
> +#include <unistd.h>
> +#include <signal.h>
> +#include <stdio.h>
> +#include <sys/mount.h>
> +#include <sys/stat.h>
> +#include <sys/mman.h>
> +#include <sys/types.h>
> +#include <sys/wait.h>
> +#include <stdlib.h>
> +#include <limits.h>
> +#include <dirent.h>
>  #include <unistd.h>
>  #include <string.h>
>  #include <fcntl.h>
> @@ -6,6 +22,7 @@
>  #include <linux/if.h>
>  #include <linux/if_tun.h>
>  
> +#include "lock.h"
>  #include "zdtmtst.h"
>  
>  const char *test_doc	= "Test TUN/TAP devices\n";
> @@ -112,13 +129,35 @@ static int dev_get_hwaddr(int fd, char *a)
>  	return 0;
>  }
>  
> +futex_t *futex;
> +
> +int child(void *unused)
> +{
> +	futex_wait_while_lt(futex, 1);
> +	return 0;
> +}
> +
>  int main(int argc, char **argv)
>  {
>  	int fds[5], ret;
> -	char addr[ETH_ALEN], a2[ETH_ALEN];
> +	char addr[ETH_ALEN], a2[ETH_ALEN], stack[128];
> +	pid_t pid;
>  
>  	test_init(argc, argv);
>  
> +	futex = mmap(NULL, sizeof(*futex), PROT_WRITE | PROT_READ, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
> +	if (futex == MAP_FAILED) {
> +		fail("mmap futex\n");
> +		return 1;
> +	}
> +	futex_init(futex);
> +
> +	pid = clone(child, stack + 128, CLONE_NEWNET | SIGCHLD, NULL);
> +	if (pid < 0) {
> +		pr_perror("clone");
> +		return 1;
> +	}
> +
>  	/* fd[0] -- opened file */
>  	fds[0] = __open_tun();
>  	if (fds[0] < 0) {
> diff --git a/test/zdtm/static/tun.desc b/test/zdtm/static/tun.desc
> index 8c7cfe86..eac32c2d 100644
> --- a/test/zdtm/static/tun.desc
> +++ b/test/zdtm/static/tun.desc
> @@ -1 +1 @@
> -{'flavor': 'ns uns', 'flags': 'suid', 'feature': 'tun'}
> +{'flavor': 'ns uns', 'flags': 'suid noauto', 'feature': 'tun'}


More information about the CRIU mailing list