[CRIU] [PATCH v2] files: don't create a transport socket for each file
Andrey Vagin
avagin at openvz.org
Thu Jul 28 23:41:19 PDT 2016
From: Andrew Vagin <avagin at virtuozzo.com>
This is an unix dgram socket which doesn't have an address and
isn't connected to somewhere, so we can use one socket for all processes.
v2: return non-zero code in error cases
Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
---
criu/cr-restore.c | 6 ++++++
criu/files.c | 25 +++++++++++++++++++------
criu/include/files.h | 2 ++
criu/include/servicefd.h | 1 +
4 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/criu/cr-restore.c b/criu/cr-restore.c
index 9bd1747..6c83d7f 100644
--- a/criu/cr-restore.c
+++ b/criu/cr-restore.c
@@ -271,6 +271,10 @@ static int root_prepare_shared(void)
if (ret)
goto err;
+ ret = open_transport_socket();
+ if (ret)
+ goto err;
+
show_saved_files();
err:
return ret;
@@ -711,6 +715,8 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
if (prepare_vmas(current, ta))
return -1;
+ close_service_fd(TRANSPORT_FD_OFF);
+
if (setup_uffd(pid, ta))
return -1;
diff --git a/criu/files.c b/criu/files.c
index a66a142..a29d317 100644
--- a/criu/files.c
+++ b/criu/files.c
@@ -1000,11 +1000,7 @@ static int serve_out_fd(int pid, int fd, struct file_desc *d)
int sock, ret;
struct fdinfo_list_entry *fle;
- sock = socket(PF_UNIX, SOCK_DGRAM, 0);
- if (sock < 0) {
- pr_perror("Can't create socket");
- return -1;
- }
+ sock = get_service_fd(TRANSPORT_FD_OFF);
pr_info("\t\tCreate fd for %d\n", fd);
@@ -1022,7 +1018,6 @@ static int serve_out_fd(int pid, int fd, struct file_desc *d)
ret = 0;
out:
- close(sock);
return ret;
}
@@ -1672,3 +1667,21 @@ char *external_lookup_by_key(char *key)
}
return NULL;
}
+
+int open_transport_socket()
+{
+ int sock;
+
+ sock = socket(PF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+ if (sock < 0) {
+ pr_perror("Can't create socket");
+ return -1;
+ }
+ if (install_service_fd(TRANSPORT_FD_OFF, sock) < 0) {
+ close(sock);
+ return -1;
+ }
+ close(sock);
+
+ return 0;
+}
diff --git a/criu/include/files.h b/criu/include/files.h
index e0b853d..7513b21 100644
--- a/criu/include/files.h
+++ b/criu/include/files.h
@@ -201,4 +201,6 @@ extern FdinfoEntry *dup_fdinfo(FdinfoEntry *old, int fd, unsigned flags);
int dup_fle(struct pstree_item *task, struct fdinfo_list_entry *ple,
int fd, unsigned flags);
+extern int open_transport_socket(void);
+
#endif /* __CR_FILES_H__ */
diff --git a/criu/include/servicefd.h b/criu/include/servicefd.h
index e133752..a35f25a 100644
--- a/criu/include/servicefd.h
+++ b/criu/include/servicefd.h
@@ -19,6 +19,7 @@ enum sfd_type {
CGROUP_YARD,
USERNSD_SK, /* Socket for usernsd */
NS_FD_OFF, /* Node's net namespace fd */
+ TRANSPORT_FD_OFF, /* to transfer file descriptors */
SERVICE_FD_MAX
};
--
2.7.4
More information about the CRIU
mailing list