[lxc-devel] [lxc/master] c/r: support for the criu pageserver

n-eiling on Github lxc-bot at linuxcontainers.org
Wed Mar 30 10:57:38 UTC 2016


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 697 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160330/0878d7dc/attachment.bin>
-------------- next part --------------
From 775f2358d1ddf62b16c278a7b27fc7ec04ae943a Mon Sep 17 00:00:00 2001
From: Niklas Eiling <niklas.eiling at rwth-aachen.de>
Date: Wed, 30 Mar 2016 12:32:02 +0200
Subject: [PATCH] c/r: support for the criu pageserver this enables lxc to
 perform "disk-less migrations" where memory pages are sent directly to the
 destination machine instead of being written to the sources filesystem first.
 For this, the migrate_opts struct has been added the strings
 "pageserver_address" and "pageserver_port" so that criu can be told where to
 look for a pageserver.

Signed-off-by: Niklas Eiling <niklas.eiling at rwth-aachen.de>
---
 src/lxc/criu.c         | 30 +++++++++++++++++++++++-------
 src/lxc/criu.h         |  4 ++--
 src/lxc/lxccontainer.c |  6 ++++--
 src/lxc/lxccontainer.h |  2 ++
 4 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/src/lxc/criu.c b/src/lxc/criu.c
index 75ae4e2..74eee6f 100644
--- a/src/lxc/criu.c
+++ b/src/lxc/criu.c
@@ -82,6 +82,10 @@ struct criu_opts {
 	 * different) on the target host. NULL if lxc.console = "none".
 	 */
 	char *console_name;
+
+    /* Address and port where a criu pageserver ist listening */
+    char *pageserver_address;
+    char *pageserver_port;
 };
 
 static int load_tty_major_minor(char *directory, char *output, int len)
@@ -270,7 +274,15 @@ static void exec_criu(struct criu_opts *opts)
 		if (opts->predump_dir) {
 			DECLARE_ARG("--prev-images-dir");
 			DECLARE_ARG(opts->predump_dir);
-		}
+        }
+
+        if (opts->pageserver_address && opts->pageserver_port) {
+            DECLARE_ARG("--page-server");
+            DECLARE_ARG("--address");
+            DECLARE_ARG(opts->pageserver_address);
+            DECLARE_ARG("--port");
+            DECLARE_ARG(opts->pageserver_port);
+        }
 
 		/* only for final dump */
 		if (strcmp(opts->action, "dump") == 0 && !opts->stop)
@@ -810,7 +822,8 @@ static int save_tty_major_minor(char *directory, struct lxc_container *c, char *
 
 /* do one of either predump or a regular dump */
 static bool do_dump(struct lxc_container *c, char *mode, char *directory,
-		    bool stop, bool verbose, char *predump_dir)
+		    bool stop, bool verbose, char *predump_dir, char *pageserver_address,
+            char *pageserver_port)
 {
 	pid_t pid;
 
@@ -836,7 +849,8 @@ static bool do_dump(struct lxc_container *c, char *mode, char *directory,
 		os.verbose = verbose;
 		os.predump_dir = predump_dir;
 		os.console_name = c->lxc_conf->console.path;
-
+        os.pageserver_address = pageserver_address;
+        os.pageserver_port = pageserver_port;
 		if (save_tty_major_minor(directory, c, os.tty_id, sizeof(os.tty_id)) < 0)
 			exit(1);
 
@@ -868,12 +882,14 @@ static bool do_dump(struct lxc_container *c, char *mode, char *directory,
 	}
 }
 
-bool __criu_pre_dump(struct lxc_container *c, char *directory, bool verbose, char *predump_dir)
+bool __criu_pre_dump(struct lxc_container *c, char *directory, bool verbose, char *predump_dir,
+                     char *pageserver_address, char *pageserver_port)
 {
-	return do_dump(c, "pre-dump", directory, false, verbose, predump_dir);
+	return do_dump(c, "pre-dump", directory, false, verbose, predump_dir, pageserver_address, pageserver_port);
 }
 
-bool __criu_dump(struct lxc_container *c, char *directory, bool stop, bool verbose, char *predump_dir)
+bool __criu_dump(struct lxc_container *c, char *directory, bool stop, bool verbose, char *predump_dir,
+                 char *pageserver_address, char *pageserver_port)
 {
 	char path[PATH_MAX];
 	int ret;
@@ -887,7 +903,7 @@ bool __criu_dump(struct lxc_container *c, char *directory, bool stop, bool verbo
 		return false;
 	}
 
-	return do_dump(c, "dump", directory, stop, verbose, predump_dir);
+	return do_dump(c, "dump", directory, stop, verbose, predump_dir, pageserver_address, pageserver_port);
 }
 
 bool __criu_restore(struct lxc_container *c, char *directory, bool verbose)
diff --git a/src/lxc/criu.h b/src/lxc/criu.h
index c110246..db2ab11 100644
--- a/src/lxc/criu.h
+++ b/src/lxc/criu.h
@@ -27,8 +27,8 @@
 
 #include <lxc/lxccontainer.h>
 
-bool __criu_pre_dump(struct lxc_container *c, char *directory, bool verbose, char *predump_dir);
-bool __criu_dump(struct lxc_container *c, char *directory, bool stop, bool verbose, char *predump_dir);
+bool __criu_pre_dump(struct lxc_container *c, char *directory, bool verbose, char *predump_dir, char *pageserver_address, char *pageserver_port);
+bool __criu_dump(struct lxc_container *c, char *directory, bool stop, bool verbose, char *predump_dir, char *pageserver_address, char *pageserver_port);
 bool __criu_restore(struct lxc_container *c, char *directory, bool verbose);
 
 #endif
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index f5a44d0..81e1cdf 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -3955,10 +3955,12 @@ static int do_lxcapi_migrate(struct lxc_container *c, unsigned int cmd,
 
 	switch (cmd) {
 	case MIGRATE_PRE_DUMP:
-		ret = !__criu_pre_dump(c, opts->directory, opts->verbose, opts->predump_dir);
+		ret = !__criu_pre_dump(c, opts->directory, opts->verbose, opts->predump_dir,
+                               opts->pageserver_address, opts->pageserver_port);
 		break;
 	case MIGRATE_DUMP:
-		ret = !__criu_dump(c, opts->directory, opts->stop, opts->verbose, opts->predump_dir);
+		ret = !__criu_dump(c, opts->directory, opts->stop, opts->verbose, opts->predump_dir,
+                           opts->pageserver_address, opts->pageserver_port);
 		break;
 	case MIGRATE_RESTORE:
 		ret = !__criu_restore(c, opts->directory, opts->verbose);
diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
index 0755901..a1df67a 100644
--- a/src/lxc/lxccontainer.h
+++ b/src/lxc/lxccontainer.h
@@ -882,6 +882,8 @@ struct migrate_opts {
 
 	bool stop; /* stop the container after dump? */
 	char *predump_dir; /* relative to directory above */
+    char *pageserver_address; /* where should memory pages be send? */
+    char *pageserver_port;
 };
 
 /*!


More information about the lxc-devel mailing list