[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