[CRIU] [PATCH 4/4] cr-restore: read pages to temporary file if
migrating
Adrian Reber
adrian at lisas.de
Wed Aug 15 05:54:29 EDT 2012
This is a hack until it is possible to read the pages-*.img directly
from restorer.c over a network socket. This workaround opens
a temporary file on /dev/shm which is then used by restorer.c to
read pages-*.img.
Signed-off-by: Adrian Reber <adrian at lisas.de>
---
cr-restore.c | 51 +++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/cr-restore.c b/cr-restore.c
index fe07599..f9b8c88 100644
--- a/cr-restore.c
+++ b/cr-restore.c
@@ -1171,7 +1171,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
struct thread_restore_args *thread_args;
LIST_HEAD(self_vma_list);
- int fd_pages = -1;
int i;
pr_info("Restore via sigreturn\n");
@@ -1195,12 +1194,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
BUILD_BUG_ON(SHMEMS_SIZE % PAGE_SIZE);
BUILD_BUG_ON(TASK_ENTRIES_SIZE % PAGE_SIZE);
- fd_pages = open_image_ro(CR_FD_PAGES, pid);
- if (fd_pages < 0) {
- pr_perror("Can't open pages-%d", pid);
- goto err;
- }
-
restore_code_len = sizeof(restorer_blob);
restore_code_len = round_up(restore_code_len, 16);
@@ -1315,7 +1308,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
task_args->pid = pid;
task_args->logfd = log_get_fd();
task_args->sigchld_act = sigchld_act;
- task_args->fd_pages = fd_pages;
strncpy(task_args->comm, core->tc->comm, sizeof(task_args->comm));
@@ -1339,6 +1331,49 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core, struct list_head *tgt_v
if (ret < 0)
goto err;
+ task_args->fd_pages = open_image_ro(CR_FD_PAGES, pid);
+ if (task_args->fd_pages < 0) {
+ pr_perror("Can't open pages-%d", pid);
+ goto err;
+ }
+
+ /* check if we are running in network migration mode */
+ if (open_listen_socket(NULL, 0) >= 0) {
+ /* yes we are. save the pages to temporary file
+ * until there is a better way to directly read
+ * the network socket from restorer.c */
+
+ int tmp_fd;
+ char buffer[PATH_MAX];
+ char tmp[PAGE_SIZE];
+ int n;
+
+ i = 0;
+ strcpy(buffer, "/dev/shm/pages-XXXXXX");
+ tmp_fd = mkstemp(buffer);
+ while (1) {
+ n = read(task_args->fd_pages, tmp, PAGE_SIZE);
+
+ if (n == 0)
+ break;
+
+ if (n == -1) {
+ pr_perror("Pages read failed");
+ goto err;
+ }
+
+ i = write(tmp_fd, tmp, n);
+ if (i!=n) {
+ pr_perror("Oops, writing failed");
+ goto err;
+ }
+
+ }
+ lseek(tmp_fd, 0, SEEK_SET);
+ close(task_args->fd_pages);
+ task_args->fd_pages = tmp_fd;
+ }
+
mutex_init(&task_args->rst_lock);
/*
--
1.7.6.5
More information about the CRIU
mailing list