Re: [Xen-devel] [PATCH v3 20/28] tools/libxc+libxl+xl: Restore v2 streams

2015-07-13 Thread Ian Jackson
Andrew Cooper writes ("[PATCH v3 20/28] tools/libxc+libxl+xl: Restore v2 
streams"):
> 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.
>  * Ownership of the save_helper_state moves to stream_read_state.
> 
> 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 
> CC: Ian Campbell 
> CC: Ian Jackson 
> CC: Wei Liu 

Acked-by: Ian Jackson 

___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel


[Xen-devel] [PATCH v3 20/28] tools/libxc+libxl+xl: Restore v2 streams

2015-07-13 Thread Andrew Cooper
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.
 * Ownership of the save_helper_state moves to stream_read_state.

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 
CC: Ian Campbell 
CC: Ian Jackson 
CC: Wei Liu 

---
v3:
 * Simplify from v2.
 * Alter the ownership of save_helper_state

v2:
 * 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  |   52 ++-
 tools/libxl/libxl_internal.h|3 ++-
 tools/libxl/libxl_save_helper.c |2 +-
 tools/libxl/libxl_stream_read.c |   35 +-
 tools/libxl/libxl_types.idl |1 +
 tools/libxl/xl_cmdimpl.c|7 +-
 8 files changed, 81 insertions(+), 40 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..74b0829 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -807,6 +807,23 @@
  */
 #define LIBXL_HAVE_SOCKET_BITMAP_ALLOC 1
 
+/*
+ * LIBXL_HAVE_SRM_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_SRM_V2 1
+
+/*
+ * LIBXL_HAVE_SRM_V1
+ *
+ * In the case that LIBXL_HAVE_SRM_V2 is set, LIBXL_HAVE_SRM_V1
+ * indicates that libxl_domain_create_restore() can handle a "stream_version"
+ * parameter of 1, and convert the stream format automatically.
+ */
+#define LIBXL_HAVE_SRM_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 5d57bc3..f2b5ffb 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,31 +971,19 @@ 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__save_helper_init(&dcs->shs);
-libxl__xc_domain_restore(egc, dcs, &dcs->shs,
- hvm, pae, superpages);
+libxl__stream_read_init(&dcs->srs);
+
+dcs->