[CRIU] [PATCH v4 05/41] cr-restore: Open transport socket earlier
Andrei Vagin
avagin at virtuozzo.com
Thu May 4 14:32:45 PDT 2017
On Thu, May 04, 2017 at 07:05:40PM +0300, Kirill Tkhai wrote:
> I need named socket to communicate with pid_ns helpers
> (see next patches) and receive answer from them
> (it's impossible to send answer to unnamed socket).
> As we already have transport socket, we'll reuse it
> for the above goal too.
>
> This patch makes transport sockets be created before
> creation of children tasks. Also, now it's created
> not only for alive tasks.
>
> (It seems, it won't be good to make futex_lock and
> futex_mutex union unless we define one as equal type
> to other using typedef, but anyway I'd happy to hear
> your opinions).
>
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
> criu/cr-restore.c | 6 +++---
> criu/files.c | 20 ++++++++++++--------
> criu/include/rst_info.h | 1 +
> criu/pstree.c | 2 +-
> 4 files changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/criu/cr-restore.c b/criu/cr-restore.c
> index 1a99797dc..9c6d4b041 100644
> --- a/criu/cr-restore.c
> +++ b/criu/cr-restore.c
> @@ -1585,6 +1585,9 @@ static int restore_task_with_children(void *_arg)
> BUG();
> }
>
> + if (open_transport_socket())
> + goto err;
> +
> timing_start(TIME_FORK);
>
> if (create_children_and_session())
> @@ -1597,9 +1600,6 @@ static int restore_task_with_children(void *_arg)
>
> restore_pgid();
>
> - if (open_transport_socket())
> - return -1;
> -
> if (current->parent == NULL) {
> /*
> * Wait when all tasks passed the CR_STATE_FORKING stage.
> diff --git a/criu/files.c b/criu/files.c
> index 01cd4c0e9..eba506608 100644
> --- a/criu/files.c
> +++ b/criu/files.c
> @@ -1325,6 +1325,7 @@ int shared_fdt_prepare(struct pstree_item *item)
>
> rsti(parent)->fdt = fdt;
>
> + mutex_init(&fdt->fdt_mutex);
> futex_init(&fdt->fdt_lock);
> fdt->nr = 1;
> fdt->pid = vpid(parent);
> @@ -1635,29 +1636,32 @@ int open_transport_socket(void)
> struct fdt *fdt = rsti(current)->fdt;
> pid_t pid = vpid(current);
> struct sockaddr_un saddr;
> - int sock, slen;
> + int sock, slen, ret = -1;
>
> - if (!task_alive(current) || (fdt && fdt->pid != pid))
> - return 0;
> + if (fdt)
> + mutex_lock(&fdt->fdt_mutex);
>
> sock = socket(PF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
> if (sock < 0) {
> pr_perror("Can't create socket");
> - return -1;
> + goto out;
> }
>
> transport_name_gen(&saddr, &slen, pid);
> if (bind(sock, (struct sockaddr *)&saddr, slen) < 0) {
> pr_perror("Can't bind transport socket %s", saddr.sun_path + 1);
> close(sock);
> - return -1;
> + goto out;
> }
>
> if (install_service_fd(TRANSPORT_FD_OFF, sock) < 0) {
> close(sock);
> - return -1;
> + goto out;
> }
> close(sock);
> -
> - return 0;
> + ret = 0;
> +out:
> + if (fdt)
> + mutex_unlock(&fdt->fdt_mutex);
> + return ret;
> }
> diff --git a/criu/include/rst_info.h b/criu/include/rst_info.h
> index 92dfc9d93..1860c21fc 100644
> --- a/criu/include/rst_info.h
> +++ b/criu/include/rst_info.h
> @@ -21,6 +21,7 @@ struct fdt {
> * The fdt table was restrored, if fdt_lock is equal to nr + 1
> */
> futex_t fdt_lock;
> + mutex_t fdt_mutex;
can you write a comment why we need this mutex
> };
>
> struct _MmEntry;
> diff --git a/criu/pstree.c b/criu/pstree.c
> index b73f4405a..315f533ba 100644
> --- a/criu/pstree.c
> +++ b/criu/pstree.c
> @@ -258,7 +258,7 @@ struct pstree_item *__alloc_pstree_item(bool rst, int level)
> void init_pstree_helper(struct pstree_item *ret)
> {
> ret->pid->state = TASK_HELPER;
> - rsti(ret)->clone_flags = CLONE_FILES | CLONE_FS;
> + rsti(ret)->clone_flags = 0;
Why do we need this ^^^
> task_entries->nr_helpers++;
> }
>
>
More information about the CRIU
mailing list