From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel <xen-devel@lists.xen.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>,
Ian Jackson <Ian.Jackson@eu.citrix.com>,
Ian Campbell <Ian.Campbell@citrix.com>,
Wei Liu <wei.liu2@citrix.com>
Subject: [PATCH v2 19/27] tools/libxc+libxl+xl: Restore v2 streams
Date: Thu, 9 Jul 2015 19:26:45 +0100 [thread overview]
Message-ID: <1436466413-25867-20-git-send-email-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <1436466413-25867-1-git-send-email-andrew.cooper3@citrix.com>
This is a complicated set of changes which must be done together for
bisectability.
* libxl-save-helper is updated to unconditionally use libxc migration v2.
* libxl compatibility workarounds in libxc are disabled for restore operations.
* libxl__stream_read_start() is logically spliced into the event location
where libxl__xc_domain_restore() used to reside.
The parameters 'hvm', 'pae', and 'superpages' were previously superfluous, and
are completely unused in migration v2. callbacks->toolstack_restore is handled
via a migration v2 record now, rather than via a callback from libxc.
NB: this change breaks Remus. Further untangling needs to happen before Remus
will function.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
CC: Ian Campbell <Ian.Campbell@citrix.com>
CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
---
Since v1:
* Drop "legacy_width" from the IDL
* Gain a LIBXL_HAVE_ to signify support of migration v2 streams
---
tools/libxc/Makefile | 4 ++--
tools/libxl/libxl.h | 17 ++++++++++++++
tools/libxl/libxl_create.c | 48 ++++++++++++---------------------------
tools/libxl/libxl_save_helper.c | 2 +-
tools/libxl/libxl_stream_read.c | 34 +++++++++++++++++++++++++++
tools/libxl/libxl_types.idl | 1 +
tools/libxl/xl_cmdimpl.c | 7 +++++-
7 files changed, 76 insertions(+), 37 deletions(-)
diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile
index b659df4..2cd0b1a 100644
--- a/tools/libxc/Makefile
+++ b/tools/libxc/Makefile
@@ -64,8 +64,8 @@ GUEST_SRCS-$(CONFIG_X86) += xc_sr_save_x86_hvm.c
GUEST_SRCS-y += xc_sr_restore.c
GUEST_SRCS-y += xc_sr_save.c
GUEST_SRCS-y += xc_offline_page.c xc_compression.c
-$(patsubst %.c,%.o,$(GUEST_SRCS-y)): CFLAGS += -DXG_LIBXL_HVM_COMPAT
-$(patsubst %.c,%.opic,$(GUEST_SRCS-y)): CFLAGS += -DXG_LIBXL_HVM_COMPAT
+xc_sr_save_x86_hvm.o: CFLAGS += -DXG_LIBXL_HVM_COMPAT
+xc_sr_save_x86_hvm.opic: CFLAGS += -DXG_LIBXL_HVM_COMPAT
else
GUEST_SRCS-y += xc_nomigrate.c
endif
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index e9d63c9..e64a606 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -807,6 +807,23 @@
*/
#define LIBXL_HAVE_SOCKET_BITMAP_ALLOC 1
+/*
+ * LIBXL_HAVE_STREAM_V2
+ *
+ * If this is defined, then the libxl_domain_create_restore() interface takes
+ * a "stream_version" parameter and supports a value of 2.
+ */
+#define LIBXL_HAVE_STREAM_V2 1
+
+/*
+ * LIBXL_HAVE_STREAM_V1
+ *
+ * In the case that LIBXL_HAVE_STREAM_V2 is set, LIBXL_HAVE_STREAM_V1
+ * indicates that libxl_domain_create_restore() can handle a "stream_version"
+ * parameter of 1, and convert the stream format automatically.
+ */
+#define LIBXL_HAVE_STREAM_V1 1
+
typedef char **libxl_string_list;
void libxl_string_list_dispose(libxl_string_list *sl);
int libxl_string_list_length(const libxl_string_list *sl);
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index be13204..2a0063a 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -704,6 +704,10 @@ static void domcreate_attach_dtdev(libxl__egc *egc,
static void domcreate_console_available(libxl__egc *egc,
libxl__domain_create_state *dcs);
+static void domcreate_stream_done(libxl__egc *egc,
+ libxl__stream_read_state *srs,
+ int ret);
+
static void domcreate_rebuild_done(libxl__egc *egc,
libxl__domain_create_state *dcs,
int ret);
@@ -933,11 +937,8 @@ static void domcreate_bootloader_done(libxl__egc *egc,
/* convenience aliases */
const uint32_t domid = dcs->guest_domid;
libxl_domain_config *const d_config = dcs->guest_config;
- libxl_domain_build_info *const info = &d_config->b_info;
const int restore_fd = dcs->restore_fd;
libxl__domain_build_state *const state = &dcs->build_state;
- libxl__srm_restore_autogen_callbacks *const callbacks =
- &dcs->shs.callbacks.restore.a;
if (rc) {
domcreate_rebuild_done(egc, dcs, rc);
@@ -970,30 +971,16 @@ static void domcreate_bootloader_done(libxl__egc *egc,
if (rc)
goto out;
- /* read signature */
- int hvm, pae, superpages;
- switch (info->type) {
- case LIBXL_DOMAIN_TYPE_HVM:
- hvm = 1;
- superpages = 1;
- pae = libxl_defbool_val(info->u.hvm.pae);
- callbacks->toolstack_restore = libxl__toolstack_restore;
- break;
- case LIBXL_DOMAIN_TYPE_PV:
- hvm = 0;
- superpages = 0;
- pae = 1;
- break;
- default:
- rc = ERROR_INVAL;
- goto out;
- }
- libxl__xc_domain_restore(egc, dcs,
- hvm, pae, superpages);
+ dcs->srs.ao = ao;
+ dcs->srs.fd = restore_fd;
+ dcs->srs.legacy = (dcs->restore_params.stream_version == 1);
+ dcs->srs.completion_callback = domcreate_stream_done;
+
+ libxl__stream_read_start(egc, &dcs->srs);
return;
out:
- libxl__xc_domain_restore_done(egc, dcs, rc, 0, 0);
+ domcreate_stream_done(egc, &dcs->srs, rc);
}
void libxl__srm_callout_callback_restore_results(unsigned long store_mfn,
@@ -1009,10 +996,11 @@ void libxl__srm_callout_callback_restore_results(unsigned long store_mfn,
shs->need_results = 0;
}
-void libxl__xc_domain_restore_done(libxl__egc *egc, void *dcs_void,
- int ret, int retval, int errnoval)
+static void domcreate_stream_done(libxl__egc *egc,
+ libxl__stream_read_state *srs,
+ int ret)
{
- libxl__domain_create_state *dcs = dcs_void;
+ libxl__domain_create_state *dcs = CONTAINER_OF(srs, *dcs, srs);
STATE_AO_GC(dcs->ao);
libxl_ctx *ctx = libxl__gc_owner(gc);
char **vments = NULL, **localents = NULL;
@@ -1029,12 +1017,6 @@ void libxl__xc_domain_restore_done(libxl__egc *egc, void *dcs_void,
if (ret)
goto out;
- if (retval) {
- LOGEV(ERROR, errnoval, "restoring domain");
- ret = ERROR_FAIL;
- goto out;
- }
-
gettimeofday(&start_time, NULL);
switch (info->type) {
diff --git a/tools/libxl/libxl_save_helper.c b/tools/libxl/libxl_save_helper.c
index 14675ae..efbe2eb 100644
--- a/tools/libxl/libxl_save_helper.c
+++ b/tools/libxl/libxl_save_helper.c
@@ -313,7 +313,7 @@ int main(int argc, char **argv)
startup("restore");
setup_signals(SIG_DFL);
- r = xc_domain_restore(xch, io_fd, dom, store_evtchn, &store_mfn,
+ r = xc_domain_restore2(xch, io_fd, dom, store_evtchn, &store_mfn,
store_domid, console_evtchn, &console_mfn,
console_domid, hvm, pae, superpages,
checkpointed,
diff --git a/tools/libxl/libxl_stream_read.c b/tools/libxl/libxl_stream_read.c
index 3011820..81095cd 100644
--- a/tools/libxl/libxl_stream_read.c
+++ b/tools/libxl/libxl_stream_read.c
@@ -139,6 +139,7 @@ void libxl__stream_read_start(libxl__egc *egc,
* work out whether to tear them down.
*/
libxl__conversion_helper_init(&dcs->chs);
+ libxl__save_helper_init(&dcs->shs);
#if defined(__x86_64__) || defined(__i386__)
if (stream->legacy) {
@@ -255,6 +256,11 @@ static void check_stream_finished(libxl__egc *egc,
libxl__convert_legacy_stream_abort(egc, &dcs->chs, rc);
}
+ if (libxl__save_helper_inuse(&dcs->shs)) {
+ skip = true;
+ libxl__save_helper_abort(egc, &dcs->shs);
+ }
+
/* There is at least one more active task to join - wait for its
callback */
if ( skip )
@@ -265,6 +271,8 @@ static void check_stream_finished(libxl__egc *egc,
LOG(DEBUG, "stream still in use");
else if (libxl__convert_legacy_stream_inuse(&dcs->chs))
LOG(DEBUG, "conversion still in use");
+ else if (libxl__save_helper_inuse(&dcs->shs))
+ LOG(DEBUG, "save/restore still in use");
else {
LOG(DEBUG, "Join complete: result %d", stream->joined_rc);
stream->completion_callback(egc, stream, stream->joined_rc);
@@ -439,6 +447,28 @@ static void record_body_done(libxl__egc *egc,
stream_failed(egc, stream, ret);
}
+void libxl__xc_domain_restore_done(libxl__egc *egc, void *dcs_void,
+ int ret, int retval, int errnoval)
+{
+ libxl__domain_create_state *dcs = dcs_void;
+ STATE_AO_GC(dcs->ao);
+
+ if (ret)
+ goto err;
+
+ if (retval) {
+ LOGEV(ERROR, errnoval, "restoring domain");
+ ret = ERROR_FAIL;
+ goto err;
+ }
+
+ stream_continue(egc, &dcs->srs);
+ return;
+
+ err:
+ check_stream_finished(egc, &dcs->srs, ret, "save/restore helper");
+}
+
#if defined(__x86_64__) || defined(__i386__)
static void conversion_done(libxl__egc *egc,
libxl__conversion_helper_state *chs, int rc)
@@ -477,6 +507,10 @@ static bool process_record(libxl__egc *egc,
stream_success(egc, stream);
break;
+ case REC_TYPE_LIBXC_CONTEXT:
+ libxl__xc_domain_restore(egc, dcs, 0, 0, 0);
+ break;
+
case REC_TYPE_XENSTORE_DATA:
ret = libxl__toolstack_restore(dcs->guest_domid, rec->body,
rec->hdr.length, &dcs->shs);
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 8dacf8d..bc0c4ef 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -355,6 +355,7 @@ libxl_domain_create_info = Struct("domain_create_info",[
libxl_domain_restore_params = Struct("domain_restore_params", [
("checkpointed_stream", integer),
+ ("stream_version", uint32, {'init_val': '1'}),
])
libxl_domain_sched_params = Struct("domain_sched_params",[
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 26b1e7d..71a22b8 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -110,7 +110,9 @@
#define XL_MANDATORY_FLAG_JSON (1U << 0) /* config data is in JSON format */
#define XL_MANDATORY_FLAG_STREAMv2 (1U << 1) /* stream is v2 */
-#define XL_MANDATORY_FLAG_ALL (XL_MANDATORY_FLAG_JSON)
+#define XL_MANDATORY_FLAG_ALL (XL_MANDATORY_FLAG_JSON | \
+ XL_MANDATORY_FLAG_STREAMv2)
+
struct save_file_header {
char magic[32]; /* savefileheader_magic */
/* All uint32_ts are in domain's byte order. */
@@ -2757,6 +2759,9 @@ static uint32_t create_domain(struct domain_create *dom_info)
libxl_domain_restore_params_init(¶ms);
params.checkpointed_stream = dom_info->checkpointed_stream;
+ params.stream_version =
+ (hdr.mandatory_flags & XL_MANDATORY_FLAG_STREAMv2) ? 2 : 1;
+
ret = libxl_domain_create_restore(ctx, &d_config,
&domid, restore_fd,
¶ms,
--
1.7.10.4
next prev parent reply other threads:[~2015-07-09 18:26 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-09 18:26 [PATCH v2 00/27] Libxl migration v2 Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 01/27] bsd-sys-queue-h-seddery: Massage `offsetof' Andrew Cooper
2015-07-10 9:32 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 02/27] tools/libxc: Always compile the compat qemu variables into xc_sr_context Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 03/27] tools/libxl: Introduce ROUNDUP() Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 04/27] tools/libxl: Introduce libxl__kill() Andrew Cooper
2015-07-10 1:34 ` Yang Hongyang
2015-07-10 8:56 ` Andrew Cooper
2015-07-10 9:08 ` Wei Liu
2015-07-10 9:25 ` Andrew Cooper
2015-07-10 9:34 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 05/27] tools/libxl: Stash all restore parameters in domain_create_state Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 06/27] tools/libxl: Split libxl__domain_create_state.restore_fd in two Andrew Cooper
2015-07-10 9:37 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 07/27] tools/libxl: Extra management APIs for the save helper Andrew Cooper
2015-07-10 9:41 ` Ian Campbell
2015-07-10 9:52 ` Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 08/27] tools/xl: Mandatory flag indicating the format of the migration stream Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 09/27] docs: Libxl migration v2 stream specification Andrew Cooper
2015-07-10 9:46 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 10/27] tools/python: Libxc migration v2 infrastructure Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 11/27] tools/python: Libxl " Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 12/27] tools/python: Other migration infrastructure Andrew Cooper
2015-07-10 9:48 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 13/27] tools/python: Verification utility for v2 stream spec compliance Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 14/27] tools/python: Conversion utility for legacy migration streams Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 15/27] tools/libxl: Migration v2 stream format Andrew Cooper
2015-07-10 9:49 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 16/27] tools/libxl: Infrastructure for reading a libxl migration v2 stream Andrew Cooper
2015-07-10 10:23 ` Ian Campbell
2015-07-10 10:47 ` Andrew Cooper
2015-07-10 11:16 ` Ian Jackson
2015-07-10 11:25 ` Ian Campbell
2015-07-10 12:28 ` Andrew Cooper
2015-07-10 12:46 ` Ian Jackson
2015-07-10 12:50 ` Andrew Cooper
2015-07-10 12:17 ` Ian Jackson
2015-07-10 12:56 ` Andrew Cooper
2015-07-10 13:09 ` Ian Jackson
2015-07-09 18:26 ` [PATCH v2 17/27] tools/libxl: Support converting a legacy stream to a " Andrew Cooper
2015-07-10 10:28 ` Ian Campbell
2015-07-10 10:39 ` Andrew Cooper
2015-07-10 12:28 ` Ian Jackson
2015-07-09 18:26 ` [PATCH v2 18/27] tools/libxl: Convert a legacy stream if needed Andrew Cooper
2015-07-10 10:31 ` Ian Campbell
2015-07-10 12:41 ` Ian Jackson
2015-07-09 18:26 ` Andrew Cooper [this message]
2015-07-10 10:45 ` [PATCH v2 19/27] tools/libxc+libxl+xl: Restore v2 streams Ian Campbell
2015-07-09 18:26 ` [PATCH v2 20/27] tools/libxl: Infrastructure for writing a v2 stream Andrew Cooper
2015-07-10 11:10 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 21/27] tools/libxc+libxl+xl: Save v2 streams Andrew Cooper
2015-07-10 10:57 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 22/27] docs/libxl: Introduce CHECKPOINT_END to support migration v2 remus streams Andrew Cooper
2015-07-10 10:59 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 23/27] tools/libxl: Write checkpoint records into the stream Andrew Cooper
2015-07-10 11:02 ` Ian Campbell
2015-07-10 11:47 ` Wei Liu
2015-07-09 18:26 ` [PATCH v2 24/27] tools/libx{c, l}: Introduce restore_callbacks.checkpoint() Andrew Cooper
2015-07-10 11:13 ` Ian Campbell
2015-07-09 18:26 ` [PATCH v2 25/27] tools/libxl: Handle checkpoint records in a libxl migration v2 stream Andrew Cooper
2015-07-10 11:18 ` Ian Campbell
2015-07-10 14:34 ` Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 26/27] tools/libxc: Drop all XG_LIBXL_HVM_COMPAT code from libxc Andrew Cooper
2015-07-09 18:26 ` [PATCH v2 27/27] tools/libxl: Drop all knowledge of toolstack callbacks Andrew Cooper
2015-07-10 3:01 ` [PATCH v2 00/27] Libxl migration v2 Yang Hongyang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1436466413-25867-20-git-send-email-andrew.cooper3@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=Ian.Campbell@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).