Add a SLE12 SP2 bug fix to the Factory libvirt package
OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=529
This commit is contained in:
parent
24511ba7f9
commit
4ab6a7b304
227
5325123d-libxl-migv2-save-restore.patch
Normal file
227
5325123d-libxl-migv2-save-restore.patch
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
commit 5325123d235deb07f39b73c06a7d9ab6494fa2c8
|
||||||
|
Author: Jim Fehlig <jfehlig@suse.com>
|
||||||
|
Date: Mon May 2 12:00:39 2016 -0600
|
||||||
|
|
||||||
|
libxl: support Xen migration stream V2 in save/restore
|
||||||
|
|
||||||
|
Xen 4.6 introduced a new migration stream commonly referred to as
|
||||||
|
"migration V2". Xen 4.6 and newer always produce this new stream,
|
||||||
|
whereas Xen 4.5 and older always produce the legacy stream.
|
||||||
|
Support for migration stream V2 can be detected at build time with
|
||||||
|
LIBXL_HAVE_SRM_V2 from libxl.h. The legacy and V2 streams are not
|
||||||
|
compatible, but a V2 host can accept and convert a legacy stream.
|
||||||
|
|
||||||
|
Commit e7440656 changed the libxl driver to use the lowest libxl
|
||||||
|
API version possible (version 0x040200) to ensure the driver
|
||||||
|
builds against older Xen releases. The old 4.2 restore API does
|
||||||
|
not support specifying a stream version and assumes a legacy
|
||||||
|
stream, even if the incoming stream is migration V2. Thinking it
|
||||||
|
has been given a legacy stream, libxl will fail to convert an
|
||||||
|
incoming stream that is already V2, which causes the entire
|
||||||
|
restore operation to fail. Xen's libvirt-related OSSTest has been
|
||||||
|
failing since commit e7440656 landed in libvirt.git master. One
|
||||||
|
of the more recent failures can be seen here
|
||||||
|
|
||||||
|
http://lists.xenproject.org/archives/html/xen-devel/2016-05/msg00071.html
|
||||||
|
|
||||||
|
This patch changes the call to libxl_domain_create_restore() to
|
||||||
|
include the stream version if LIBXL_HAVE_SRM_V2 is defined. The
|
||||||
|
version field of the libxlSavefileHeader struct is also updated
|
||||||
|
to '2' when LIBXL_HAVE_SRM_V2 is defined, ensuring the stream
|
||||||
|
version in the header matches the actual stream version produced
|
||||||
|
by Xen. Along with bumping the libxl API requirement to 0x040400,
|
||||||
|
this patch fixes save/restore on a migration V2 Xen host.
|
||||||
|
|
||||||
|
Oddly, migration has never used the libxlSavefileHeader. It
|
||||||
|
handles passing configuration in the Begin and Prepare phases,
|
||||||
|
and then calls libxl directly to transfer domain state/memory
|
||||||
|
in the Perform phase. A subsequent patch will add stream
|
||||||
|
version handling in the Begin and Prepare phase handshaking,
|
||||||
|
which will fix the migration related OSSTest failures.
|
||||||
|
|
||||||
|
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
|
||||||
|
|
||||||
|
Index: libvirt-1.3.4/src/libxl/libxl_conf.h
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/src/libxl/libxl_conf.h
|
||||||
|
+++ libvirt-1.3.4/src/libxl/libxl_conf.h
|
||||||
|
@@ -148,7 +148,11 @@ struct _libxlDriverPrivate {
|
||||||
|
};
|
||||||
|
|
||||||
|
# define LIBXL_SAVE_MAGIC "libvirt-xml\n \0 \r"
|
||||||
|
-# define LIBXL_SAVE_VERSION 1
|
||||||
|
+# ifdef LIBXL_HAVE_SRM_V2
|
||||||
|
+# define LIBXL_SAVE_VERSION 2
|
||||||
|
+# else
|
||||||
|
+# define LIBXL_SAVE_VERSION 1
|
||||||
|
+# endif
|
||||||
|
|
||||||
|
typedef struct _libxlSavefileHeader libxlSavefileHeader;
|
||||||
|
typedef libxlSavefileHeader *libxlSavefileHeaderPtr;
|
||||||
|
Index: libvirt-1.3.4/src/libxl/libxl_domain.c
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/src/libxl/libxl_domain.c
|
||||||
|
+++ libvirt-1.3.4/src/libxl/libxl_domain.c
|
||||||
|
@@ -514,7 +514,7 @@ libxlDomainShutdownThread(void *opaque)
|
||||||
|
}
|
||||||
|
libxlDomainDestroyInternal(driver, vm);
|
||||||
|
libxlDomainCleanup(driver, vm);
|
||||||
|
- if (libxlDomainStart(driver, vm, false, -1) < 0) {
|
||||||
|
+ if (libxlDomainStartNew(driver, vm, false) < 0) {
|
||||||
|
virErrorPtr err = virGetLastError();
|
||||||
|
VIR_ERROR(_("Failed to restart VM '%s': %s"),
|
||||||
|
vm->def->name, err ? err->message : _("unknown error"));
|
||||||
|
@@ -1006,14 +1006,23 @@ libxlDomainCreateIfaceNames(virDomainDef
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+#ifdef LIBXL_HAVE_SRM_V2
|
||||||
|
+# define LIBXL_DOMSTART_RESTORE_VER_ATTR /* empty */
|
||||||
|
+#else
|
||||||
|
+# define LIBXL_DOMSTART_RESTORE_VER_ATTR ATTRIBUTE_UNUSED
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Start a domain through libxenlight.
|
||||||
|
*
|
||||||
|
* virDomainObjPtr must be locked and a job acquired on invocation
|
||||||
|
*/
|
||||||
|
-int
|
||||||
|
-libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||||
|
- bool start_paused, int restore_fd)
|
||||||
|
+static int
|
||||||
|
+libxlDomainStart(libxlDriverPrivatePtr driver,
|
||||||
|
+ virDomainObjPtr vm,
|
||||||
|
+ bool start_paused,
|
||||||
|
+ int restore_fd,
|
||||||
|
+ uint32_t restore_ver LIBXL_DOMSTART_RESTORE_VER_ATTR)
|
||||||
|
{
|
||||||
|
libxl_domain_config d_config;
|
||||||
|
virDomainDefPtr def = NULL;
|
||||||
|
@@ -1049,6 +1058,7 @@ libxlDomainStart(libxlDriverPrivatePtr d
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
restore_fd = managed_save_fd;
|
||||||
|
+ restore_ver = hdr.version;
|
||||||
|
|
||||||
|
if (STRNEQ(vm->def->name, def->name) ||
|
||||||
|
memcmp(vm->def->uuid, def->uuid, VIR_UUID_BUFLEN)) {
|
||||||
|
@@ -1117,6 +1127,9 @@ libxlDomainStart(libxlDriverPrivatePtr d
|
||||||
|
&domid, NULL, &aop_console_how);
|
||||||
|
} else {
|
||||||
|
libxl_domain_restore_params_init(¶ms);
|
||||||
|
+#ifdef LIBXL_HAVE_SRM_V2
|
||||||
|
+ params.stream_version = restore_ver;
|
||||||
|
+#endif
|
||||||
|
ret = libxl_domain_create_restore(cfg->ctx, &d_config, &domid,
|
||||||
|
restore_fd, ¶ms, NULL,
|
||||||
|
&aop_console_how);
|
||||||
|
@@ -1203,6 +1216,25 @@ libxlDomainStart(libxlDriverPrivatePtr d
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int
|
||||||
|
+libxlDomainStartNew(libxlDriverPrivatePtr driver,
|
||||||
|
+ virDomainObjPtr vm,
|
||||||
|
+ bool start_paused)
|
||||||
|
+{
|
||||||
|
+ return libxlDomainStart(driver, vm, start_paused, -1, LIBXL_SAVE_VERSION);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+libxlDomainStartRestore(libxlDriverPrivatePtr driver,
|
||||||
|
+ virDomainObjPtr vm,
|
||||||
|
+ bool start_paused,
|
||||||
|
+ int restore_fd,
|
||||||
|
+ uint32_t restore_ver)
|
||||||
|
+{
|
||||||
|
+ return libxlDomainStart(driver, vm, start_paused,
|
||||||
|
+ restore_fd, restore_ver);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
bool
|
||||||
|
libxlDomainDefCheckABIStability(libxlDriverPrivatePtr driver,
|
||||||
|
virDomainDefPtr src,
|
||||||
|
Index: libvirt-1.3.4/src/libxl/libxl_domain.h
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/src/libxl/libxl_domain.h
|
||||||
|
+++ libvirt-1.3.4/src/libxl/libxl_domain.h
|
||||||
|
@@ -142,10 +142,16 @@ libxlDomainSetVcpuAffinities(libxlDriver
|
||||||
|
virDomainObjPtr vm);
|
||||||
|
|
||||||
|
int
|
||||||
|
-libxlDomainStart(libxlDriverPrivatePtr driver,
|
||||||
|
- virDomainObjPtr vm,
|
||||||
|
- bool start_paused,
|
||||||
|
- int restore_fd);
|
||||||
|
+libxlDomainStartNew(libxlDriverPrivatePtr driver,
|
||||||
|
+ virDomainObjPtr vm,
|
||||||
|
+ bool start_paused);
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+libxlDomainStartRestore(libxlDriverPrivatePtr driver,
|
||||||
|
+ virDomainObjPtr vm,
|
||||||
|
+ bool start_paused,
|
||||||
|
+ int restore_fd,
|
||||||
|
+ uint32_t restore_ver);
|
||||||
|
|
||||||
|
bool
|
||||||
|
libxlDomainDefCheckABIStability(libxlDriverPrivatePtr driver,
|
||||||
|
Index: libvirt-1.3.4/src/libxl/libxl_driver.c
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/src/libxl/libxl_driver.c
|
||||||
|
+++ libvirt-1.3.4/src/libxl/libxl_driver.c
|
||||||
|
@@ -323,7 +323,7 @@ libxlAutostartDomain(virDomainObjPtr vm,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vm->autostart && !virDomainObjIsActive(vm) &&
|
||||||
|
- libxlDomainStart(driver, vm, false, -1) < 0) {
|
||||||
|
+ libxlDomainStartNew(driver, vm, false) < 0) {
|
||||||
|
err = virGetLastError();
|
||||||
|
VIR_ERROR(_("Failed to autostart VM '%s': %s"),
|
||||||
|
vm->def->name,
|
||||||
|
@@ -998,8 +998,8 @@ libxlDomainCreateXML(virConnectPtr conn,
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (libxlDomainStart(driver, vm, (flags & VIR_DOMAIN_START_PAUSED) != 0,
|
||||||
|
- -1) < 0) {
|
||||||
|
+ if (libxlDomainStartNew(driver, vm,
|
||||||
|
+ (flags & VIR_DOMAIN_START_PAUSED) != 0) < 0) {
|
||||||
|
if (!vm->persistent) {
|
||||||
|
virDomainObjListRemove(driver->domains, vm);
|
||||||
|
vm = NULL;
|
||||||
|
@@ -1818,7 +1818,9 @@ libxlDomainRestoreFlags(virConnectPtr co
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = libxlDomainStart(driver, vm, (flags & VIR_DOMAIN_SAVE_PAUSED) != 0, fd);
|
||||||
|
+ ret = libxlDomainStartRestore(driver, vm,
|
||||||
|
+ (flags & VIR_DOMAIN_SAVE_PAUSED) != 0,
|
||||||
|
+ fd, hdr.version);
|
||||||
|
if (ret < 0 && !vm->persistent)
|
||||||
|
virDomainObjListRemove(driver->domains, vm);
|
||||||
|
|
||||||
|
@@ -2681,7 +2683,8 @@ libxlDomainCreateWithFlags(virDomainPtr
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = libxlDomainStart(driver, vm, (flags & VIR_DOMAIN_START_PAUSED) != 0, -1);
|
||||||
|
+ ret = libxlDomainStartNew(driver, vm,
|
||||||
|
+ (flags & VIR_DOMAIN_START_PAUSED) != 0);
|
||||||
|
if (ret < 0)
|
||||||
|
goto endjob;
|
||||||
|
dom->id = vm->def->id;
|
||||||
|
Index: libvirt-1.3.4/src/libxl/libxl_migration.c
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/src/libxl/libxl_migration.c
|
||||||
|
+++ libvirt-1.3.4/src/libxl/libxl_migration.c
|
||||||
|
@@ -106,7 +106,7 @@ libxlDoMigrateReceive(void *opaque)
|
||||||
|
* Always start the domain paused. If needed, unpause in the
|
||||||
|
* finish phase, after transfer of the domain is complete.
|
||||||
|
*/
|
||||||
|
- ret = libxlDomainStart(driver, vm, true, recvfd);
|
||||||
|
+ ret = libxlDomainStartRestore(driver, vm, true, recvfd, LIBXL_SAVE_VERSION);
|
||||||
|
|
||||||
|
if (ret < 0 && !vm->persistent)
|
||||||
|
remove_dom = true;
|
392
f9edcfa4-libxl-migv2-migration.patch
Normal file
392
f9edcfa4-libxl-migv2-migration.patch
Normal file
@ -0,0 +1,392 @@
|
|||||||
|
commit f9edcfa47396fdaab69ed72f0d5e0b751aa014fa
|
||||||
|
Author: Jim Fehlig <jfehlig@suse.com>
|
||||||
|
Date: Fri Apr 29 15:08:05 2016 -0600
|
||||||
|
|
||||||
|
libxl: support migration stream V2 in migration
|
||||||
|
|
||||||
|
Similar to "support Xen migration stream V2 in save/restore",
|
||||||
|
add support for indicating the migration stream version in
|
||||||
|
the migration code. To accomplish this, add a minimal migration
|
||||||
|
cookie in the libxl driver that is passed between source and
|
||||||
|
destination hosts. Initially, the cookie is only used in
|
||||||
|
the Begin and Prepare phases of migration to communicate the
|
||||||
|
version of the migration stream produced by the source.
|
||||||
|
|
||||||
|
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
|
||||||
|
|
||||||
|
Index: libvirt-1.3.4/src/libxl/libxl_driver.c
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/src/libxl/libxl_driver.c
|
||||||
|
+++ libvirt-1.3.4/src/libxl/libxl_driver.c
|
||||||
|
@@ -5151,8 +5151,8 @@ static char *
|
||||||
|
libxlDomainMigrateBegin3Params(virDomainPtr domain,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int nparams,
|
||||||
|
- char **cookieout ATTRIBUTE_UNUSED,
|
||||||
|
- int *cookieoutlen ATTRIBUTE_UNUSED,
|
||||||
|
+ char **cookieout,
|
||||||
|
+ int *cookieoutlen,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
const char *xmlin = NULL;
|
||||||
|
@@ -5193,15 +5193,16 @@ libxlDomainMigrateBegin3Params(virDomain
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- return libxlDomainMigrationBegin(domain->conn, vm, xmlin);
|
||||||
|
+ return libxlDomainMigrationBegin(domain->conn, vm, xmlin,
|
||||||
|
+ cookieout, cookieoutlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
libxlDomainMigratePrepare3Params(virConnectPtr dconn,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int nparams,
|
||||||
|
- const char *cookiein ATTRIBUTE_UNUSED,
|
||||||
|
- int cookieinlen ATTRIBUTE_UNUSED,
|
||||||
|
+ const char *cookiein,
|
||||||
|
+ int cookieinlen,
|
||||||
|
char **cookieout ATTRIBUTE_UNUSED,
|
||||||
|
int *cookieoutlen ATTRIBUTE_UNUSED,
|
||||||
|
char **uri_out,
|
||||||
|
@@ -5240,7 +5241,8 @@ libxlDomainMigratePrepare3Params(virConn
|
||||||
|
if (virDomainMigratePrepare3ParamsEnsureACL(dconn, def) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
- if (libxlDomainMigrationPrepare(dconn, &def, uri_in, uri_out, flags) < 0)
|
||||||
|
+ if (libxlDomainMigrationPrepare(dconn, &def, uri_in, uri_out,
|
||||||
|
+ cookiein, cookieinlen, flags) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
Index: libvirt-1.3.4/src/libxl/libxl_migration.c
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/src/libxl/libxl_migration.c
|
||||||
|
+++ libvirt-1.3.4/src/libxl/libxl_migration.c
|
||||||
|
@@ -48,6 +48,18 @@
|
||||||
|
|
||||||
|
VIR_LOG_INIT("libxl.libxl_migration");
|
||||||
|
|
||||||
|
+typedef struct _libxlMigrationCookie libxlMigrationCookie;
|
||||||
|
+typedef libxlMigrationCookie *libxlMigrationCookiePtr;
|
||||||
|
+struct _libxlMigrationCookie {
|
||||||
|
+ /* Host properties */
|
||||||
|
+ char *srcHostname;
|
||||||
|
+ uint32_t xenMigStreamVer;
|
||||||
|
+
|
||||||
|
+ /* Guest properties */
|
||||||
|
+ unsigned char uuid[VIR_UUID_BUFLEN];
|
||||||
|
+ char *name;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
typedef struct _libxlMigrationDstArgs {
|
||||||
|
virObject parent;
|
||||||
|
|
||||||
|
@@ -55,6 +67,7 @@ typedef struct _libxlMigrationDstArgs {
|
||||||
|
virConnectPtr conn;
|
||||||
|
virDomainObjPtr vm;
|
||||||
|
unsigned int flags;
|
||||||
|
+ libxlMigrationCookiePtr migcookie;
|
||||||
|
|
||||||
|
/* for freeing listen sockets */
|
||||||
|
virNetSocketPtr *socks;
|
||||||
|
@@ -63,11 +76,166 @@ typedef struct _libxlMigrationDstArgs {
|
||||||
|
|
||||||
|
static virClassPtr libxlMigrationDstArgsClass;
|
||||||
|
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+libxlMigrationCookieFree(libxlMigrationCookiePtr mig)
|
||||||
|
+{
|
||||||
|
+ if (!mig)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ VIR_FREE(mig->srcHostname);
|
||||||
|
+ VIR_FREE(mig->name);
|
||||||
|
+ VIR_FREE(mig);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static libxlMigrationCookiePtr
|
||||||
|
+libxlMigrationCookieNew(virDomainObjPtr dom)
|
||||||
|
+{
|
||||||
|
+ libxlMigrationCookiePtr mig = NULL;
|
||||||
|
+
|
||||||
|
+ if (VIR_ALLOC(mig) < 0)
|
||||||
|
+ goto error;
|
||||||
|
+
|
||||||
|
+ if (VIR_STRDUP(mig->name, dom->def->name) < 0)
|
||||||
|
+ goto error;
|
||||||
|
+
|
||||||
|
+ memcpy(mig->uuid, dom->def->uuid, VIR_UUID_BUFLEN);
|
||||||
|
+
|
||||||
|
+ if (!(mig->srcHostname = virGetHostname()))
|
||||||
|
+ goto error;
|
||||||
|
+
|
||||||
|
+ mig->xenMigStreamVer = LIBXL_SAVE_VERSION;
|
||||||
|
+
|
||||||
|
+ return mig;
|
||||||
|
+
|
||||||
|
+ error:
|
||||||
|
+ libxlMigrationCookieFree(mig);
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+libxlMigrationBakeCookie(libxlMigrationCookiePtr mig,
|
||||||
|
+ char **cookieout,
|
||||||
|
+ int *cookieoutlen)
|
||||||
|
+{
|
||||||
|
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
|
+
|
||||||
|
+ if (!cookieout || !cookieoutlen)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ *cookieoutlen = 0;
|
||||||
|
+ virUUIDFormat(mig->uuid, uuidstr);
|
||||||
|
+
|
||||||
|
+ virBufferAddLit(&buf, "<libxl-migration>\n");
|
||||||
|
+ virBufferAdjustIndent(&buf, 2);
|
||||||
|
+ virBufferEscapeString(&buf, "<name>%s</name>\n", mig->name);
|
||||||
|
+ virBufferAsprintf(&buf, "<uuid>%s</uuid>\n", uuidstr);
|
||||||
|
+ virBufferEscapeString(&buf, "<hostname>%s</hostname>\n", mig->srcHostname);
|
||||||
|
+ virBufferAsprintf(&buf, "<migration-stream-version>%u</migration-stream-version>\n", mig->xenMigStreamVer);
|
||||||
|
+ virBufferAdjustIndent(&buf, -2);
|
||||||
|
+ virBufferAddLit(&buf, "</libxl-migration>\n");
|
||||||
|
+
|
||||||
|
+ if (virBufferCheckError(&buf) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ *cookieout = virBufferContentAndReset(&buf);
|
||||||
|
+ *cookieoutlen = strlen(*cookieout) + 1;
|
||||||
|
+
|
||||||
|
+ VIR_DEBUG("cookielen=%d cookie=%s", *cookieoutlen, *cookieout);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+libxlMigrationEatCookie(const char *cookiein,
|
||||||
|
+ int cookieinlen,
|
||||||
|
+ libxlMigrationCookiePtr *migout)
|
||||||
|
+{
|
||||||
|
+ libxlMigrationCookiePtr mig = NULL;
|
||||||
|
+ xmlDocPtr doc = NULL;
|
||||||
|
+ xmlXPathContextPtr ctxt = NULL;
|
||||||
|
+ char *uuidstr = NULL;
|
||||||
|
+ int ret = -1;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Assume a legacy (V1) migration stream if request came from a
|
||||||
|
+ * source host without cookie support, and hence no way to
|
||||||
|
+ * specify a stream version.
|
||||||
|
+ */
|
||||||
|
+ if (!cookiein || !cookieinlen) {
|
||||||
|
+ if (VIR_ALLOC(mig) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ mig->xenMigStreamVer = 1;
|
||||||
|
+ *migout = mig;
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (cookiein[cookieinlen-1] != '\0') {
|
||||||
|
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
+ _("Migration cookie was not NULL terminated"));
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ VIR_DEBUG("cookielen=%d cookie='%s'", cookieinlen, NULLSTR(cookiein));
|
||||||
|
+
|
||||||
|
+ if (VIR_ALLOC(mig) < 0)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (!(doc = virXMLParseStringCtxt(cookiein,
|
||||||
|
+ _("(libxl_migration_cookie)"),
|
||||||
|
+ &ctxt)))
|
||||||
|
+ goto error;
|
||||||
|
+
|
||||||
|
+ /* Extract domain name */
|
||||||
|
+ if (!(mig->name = virXPathString("string(./name[1])", ctxt))) {
|
||||||
|
+ virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
+ "%s", _("missing name element in migration data"));
|
||||||
|
+ goto error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Extract domain uuid */
|
||||||
|
+ uuidstr = virXPathString("string(./uuid[1])", ctxt);
|
||||||
|
+ if (!uuidstr) {
|
||||||
|
+ virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
+ "%s", _("missing uuid element in migration data"));
|
||||||
|
+ goto error;
|
||||||
|
+ }
|
||||||
|
+ if (virUUIDParse(uuidstr, mig->uuid) < 0) {
|
||||||
|
+ virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
+ "%s", _("malformed uuid element"));
|
||||||
|
+ goto error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (virXPathUInt("string(./migration-stream-version[1])",
|
||||||
|
+ ctxt, &mig->xenMigStreamVer) < 0) {
|
||||||
|
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
+ _("missing Xen migration stream version"));
|
||||||
|
+ goto error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *migout = mig;
|
||||||
|
+ ret = 0;
|
||||||
|
+ goto cleanup;
|
||||||
|
+
|
||||||
|
+ error:
|
||||||
|
+ libxlMigrationCookieFree(mig);
|
||||||
|
+
|
||||||
|
+ cleanup:
|
||||||
|
+ VIR_FREE(uuidstr);
|
||||||
|
+ xmlXPathFreeContext(ctxt);
|
||||||
|
+ xmlFreeDoc(doc);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
libxlMigrationDstArgsDispose(void *obj)
|
||||||
|
{
|
||||||
|
libxlMigrationDstArgs *args = obj;
|
||||||
|
|
||||||
|
+ libxlMigrationCookieFree(args->migcookie);
|
||||||
|
VIR_FREE(args->socks);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -106,7 +274,8 @@ libxlDoMigrateReceive(void *opaque)
|
||||||
|
* Always start the domain paused. If needed, unpause in the
|
||||||
|
* finish phase, after transfer of the domain is complete.
|
||||||
|
*/
|
||||||
|
- ret = libxlDomainStartRestore(driver, vm, true, recvfd, LIBXL_SAVE_VERSION);
|
||||||
|
+ ret = libxlDomainStartRestore(driver, vm, true, recvfd,
|
||||||
|
+ args->migcookie->xenMigStreamVer);
|
||||||
|
|
||||||
|
if (ret < 0 && !vm->persistent)
|
||||||
|
remove_dom = true;
|
||||||
|
@@ -227,10 +396,13 @@ libxlDomainMigrationIsAllowed(virDomainD
|
||||||
|
char *
|
||||||
|
libxlDomainMigrationBegin(virConnectPtr conn,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
- const char *xmlin)
|
||||||
|
+ const char *xmlin,
|
||||||
|
+ char **cookieout,
|
||||||
|
+ int *cookieoutlen)
|
||||||
|
{
|
||||||
|
libxlDriverPrivatePtr driver = conn->privateData;
|
||||||
|
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
|
||||||
|
+ libxlMigrationCookiePtr mig;
|
||||||
|
virDomainDefPtr tmpdef = NULL;
|
||||||
|
virDomainDefPtr def;
|
||||||
|
char *xml = NULL;
|
||||||
|
@@ -238,6 +410,12 @@ libxlDomainMigrationBegin(virConnectPtr
|
||||||
|
if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
+ if (!(mig = libxlMigrationCookieNew(vm)))
|
||||||
|
+ goto endjob;
|
||||||
|
+
|
||||||
|
+ if (libxlMigrationBakeCookie(mig, cookieout, cookieoutlen) < 0)
|
||||||
|
+ goto endjob;
|
||||||
|
+
|
||||||
|
if (xmlin) {
|
||||||
|
if (!(tmpdef = virDomainDefParseString(xmlin, cfg->caps,
|
||||||
|
driver->xmlopt,
|
||||||
|
@@ -308,9 +486,12 @@ libxlDomainMigrationPrepare(virConnectPt
|
||||||
|
virDomainDefPtr *def,
|
||||||
|
const char *uri_in,
|
||||||
|
char **uri_out,
|
||||||
|
+ const char *cookiein,
|
||||||
|
+ int cookieinlen,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
libxlDriverPrivatePtr driver = dconn->privateData;
|
||||||
|
+ libxlMigrationCookiePtr mig = NULL;
|
||||||
|
virDomainObjPtr vm = NULL;
|
||||||
|
char *hostname = NULL;
|
||||||
|
unsigned short port;
|
||||||
|
@@ -323,6 +504,16 @@ libxlDomainMigrationPrepare(virConnectPt
|
||||||
|
size_t i;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
+ if (libxlMigrationEatCookie(cookiein, cookieinlen, &mig) < 0)
|
||||||
|
+ goto error;
|
||||||
|
+
|
||||||
|
+ if (mig->xenMigStreamVer > LIBXL_SAVE_VERSION) {
|
||||||
|
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
||||||
|
+ _("Xen migration stream version '%d' is not supported on this host"),
|
||||||
|
+ mig->xenMigStreamVer);
|
||||||
|
+ goto error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!(vm = virDomainObjListAdd(driver->domains, *def,
|
||||||
|
driver->xmlopt,
|
||||||
|
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
|
||||||
|
@@ -409,6 +600,7 @@ libxlDomainMigrationPrepare(virConnectPt
|
||||||
|
args->flags = flags;
|
||||||
|
args->socks = socks;
|
||||||
|
args->nsocks = nsocks;
|
||||||
|
+ args->migcookie = mig;
|
||||||
|
|
||||||
|
for (i = 0; i < nsocks; i++) {
|
||||||
|
if (virNetSocketSetBlocking(socks[i], true) < 0)
|
||||||
|
@@ -479,11 +671,14 @@ libxlDoMigrateP2P(libxlDriverPrivatePtr
|
||||||
|
char *uri_out = NULL;
|
||||||
|
char *dom_xml = NULL;
|
||||||
|
unsigned long destflags;
|
||||||
|
+ char *cookieout = NULL;
|
||||||
|
+ int cookieoutlen;
|
||||||
|
bool cancelled = true;
|
||||||
|
virErrorPtr orig_err = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
- dom_xml = libxlDomainMigrationBegin(sconn, vm, xmlin);
|
||||||
|
+ dom_xml = libxlDomainMigrationBegin(sconn, vm, xmlin,
|
||||||
|
+ &cookieout, &cookieoutlen);
|
||||||
|
if (!dom_xml)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
@@ -509,7 +704,7 @@ libxlDoMigrateP2P(libxlDriverPrivatePtr
|
||||||
|
VIR_DEBUG("Prepare3");
|
||||||
|
virObjectUnlock(vm);
|
||||||
|
ret = dconn->driver->domainMigratePrepare3Params
|
||||||
|
- (dconn, params, nparams, NULL, 0, NULL, NULL, &uri_out, destflags);
|
||||||
|
+ (dconn, params, nparams, cookieout, cookieoutlen, NULL, NULL, &uri_out, destflags);
|
||||||
|
virObjectLock(vm);
|
||||||
|
|
||||||
|
if (ret == -1)
|
||||||
|
@@ -580,6 +775,7 @@ libxlDoMigrateP2P(libxlDriverPrivatePtr
|
||||||
|
virFreeError(orig_err);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ VIR_FREE(cookieout);
|
||||||
|
VIR_FREE(dom_xml);
|
||||||
|
VIR_FREE(uri_out);
|
||||||
|
virTypedParamsFree(params, nparams);
|
||||||
|
Index: libvirt-1.3.4/src/libxl/libxl_migration.h
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/src/libxl/libxl_migration.h
|
||||||
|
+++ libvirt-1.3.4/src/libxl/libxl_migration.h
|
||||||
|
@@ -42,7 +42,9 @@
|
||||||
|
char *
|
||||||
|
libxlDomainMigrationBegin(virConnectPtr conn,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
- const char *xmlin);
|
||||||
|
+ const char *xmlin,
|
||||||
|
+ char **cookieout,
|
||||||
|
+ int *cookieoutlen);
|
||||||
|
|
||||||
|
virDomainDefPtr
|
||||||
|
libxlDomainMigrationPrepareDef(libxlDriverPrivatePtr driver,
|
||||||
|
@@ -54,6 +56,8 @@ libxlDomainMigrationPrepare(virConnectPt
|
||||||
|
virDomainDefPtr *def,
|
||||||
|
const char *uri_in,
|
||||||
|
char **uri_out,
|
||||||
|
+ const char *cookiein,
|
||||||
|
+ int cookieinlen,
|
||||||
|
unsigned int flags);
|
||||||
|
|
||||||
|
int
|
58
fccf2725-libxl-API-4.4.patch
Normal file
58
fccf2725-libxl-API-4.4.patch
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
commit fccf27253cedd131c5c4720d31d96ecc68c20e59
|
||||||
|
Author: Jim Fehlig <jfehlig@suse.com>
|
||||||
|
Date: Thu Apr 28 21:08:28 2016 -0600
|
||||||
|
|
||||||
|
libxl: switch to using libxl_domain_create_restore from v4.4 API
|
||||||
|
|
||||||
|
In LIBXL_API_VERSION 0x040400, the libxl_domain_create_restore API
|
||||||
|
gained a parameter for specifying restore parameters. Switch to
|
||||||
|
using version 0x040400, which will be useful in a subsequent commit
|
||||||
|
to specify the Xen migration stream version when restoring.
|
||||||
|
|
||||||
|
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
|
||||||
|
|
||||||
|
Index: libvirt-1.3.4/configure.ac
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/configure.ac
|
||||||
|
+++ libvirt-1.3.4/configure.ac
|
||||||
|
@@ -919,10 +919,11 @@ if test "$with_libxl" != "no" ; then
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
-# Until there is a need to use enhancements of libxl APIs such as
|
||||||
|
-# libxl_domain_create_restore and libxl_set_vcpuaffinity, stick with
|
||||||
|
-# the APIs as defined in libxl API version 4.2.0.
|
||||||
|
-LIBXL_CFLAGS="$LIBXL_CFLAGS -DLIBXL_API_VERSION=0x040200"
|
||||||
|
+# LIBXL_API_VERSION 4.4.0 introduced a new parameter to
|
||||||
|
+# libxl_domain_create_restore for specifying restore parameters.
|
||||||
|
+# The libxl driver will make use of this new parameter for specifying
|
||||||
|
+# the Xen migration stream version.
|
||||||
|
+LIBXL_CFLAGS="$LIBXL_CFLAGS -DLIBXL_API_VERSION=0x040400"
|
||||||
|
LIBS="$old_LIBS"
|
||||||
|
CFLAGS="$old_CFLAGS"
|
||||||
|
|
||||||
|
Index: libvirt-1.3.4/src/libxl/libxl_domain.c
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.3.4.orig/src/libxl/libxl_domain.c
|
||||||
|
+++ libvirt-1.3.4/src/libxl/libxl_domain.c
|
||||||
|
@@ -1028,6 +1028,7 @@ libxlDomainStart(libxlDriverPrivatePtr d
|
||||||
|
libxlDriverConfigPtr cfg;
|
||||||
|
virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
|
||||||
|
libxl_asyncprogress_how aop_console_how;
|
||||||
|
+ libxl_domain_restore_params params;
|
||||||
|
|
||||||
|
libxl_domain_config_init(&d_config);
|
||||||
|
|
||||||
|
@@ -1115,8 +1116,11 @@ libxlDomainStart(libxlDriverPrivatePtr d
|
||||||
|
ret = libxl_domain_create_new(cfg->ctx, &d_config,
|
||||||
|
&domid, NULL, &aop_console_how);
|
||||||
|
} else {
|
||||||
|
+ libxl_domain_restore_params_init(¶ms);
|
||||||
|
ret = libxl_domain_create_restore(cfg->ctx, &d_config, &domid,
|
||||||
|
- restore_fd, NULL, &aop_console_how);
|
||||||
|
+ restore_fd, ¶ms, NULL,
|
||||||
|
+ &aop_console_how);
|
||||||
|
+ libxl_domain_restore_params_dispose(¶ms);
|
||||||
|
}
|
||||||
|
virObjectLock(vm);
|
||||||
|
|
@ -10,7 +10,7 @@ Index: libvirt-1.3.4/configure.ac
|
|||||||
LIBVIRT_CHECK_NUMACTL
|
LIBVIRT_CHECK_NUMACTL
|
||||||
LIBVIRT_CHECK_OPENWSMAN
|
LIBVIRT_CHECK_OPENWSMAN
|
||||||
LIBVIRT_CHECK_PCIACCESS
|
LIBVIRT_CHECK_PCIACCESS
|
||||||
@@ -2470,11 +2471,12 @@ if test "$with_libvirtd" = "no" ; then
|
@@ -2471,11 +2472,12 @@ if test "$with_libvirtd" = "no" ; then
|
||||||
with_interface=no
|
with_interface=no
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ Index: libvirt-1.3.4/configure.ac
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
if test "$with_interface" = "yes" ; then
|
if test "$with_interface" = "yes" ; then
|
||||||
@@ -2853,6 +2855,7 @@ LIBVIRT_RESULT_FUSE
|
@@ -2854,6 +2856,7 @@ LIBVIRT_RESULT_FUSE
|
||||||
LIBVIRT_RESULT_GLUSTER
|
LIBVIRT_RESULT_GLUSTER
|
||||||
LIBVIRT_RESULT_HAL
|
LIBVIRT_RESULT_HAL
|
||||||
LIBVIRT_RESULT_NETCF
|
LIBVIRT_RESULT_NETCF
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri May 13 18:12:40 UTC 2016 - jfehlig@suse.com
|
||||||
|
|
||||||
|
- libxl: support Xen migration stream V2
|
||||||
|
fccf2725-libxl-API-4.4.patch,
|
||||||
|
5325123d-libxl-migv2-save-restore.patch,
|
||||||
|
f9edcfa4-libxl-migv2-migration.patch
|
||||||
|
bsc#978361
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri May 13 17:23:24 UTC 2016 - jfehlig@suse.com
|
Fri May 13 17:23:24 UTC 2016 - jfehlig@suse.com
|
||||||
|
|
||||||
|
@ -464,6 +464,9 @@ Patch2: 538012c8-default-vram.patch
|
|||||||
Patch3: 96b21fb0-vram-tests.patch
|
Patch3: 96b21fb0-vram-tests.patch
|
||||||
Patch4: 400e716d-libxl-noprope-emulator.patch
|
Patch4: 400e716d-libxl-noprope-emulator.patch
|
||||||
Patch5: b90c4b5f-tests-use-qemu-xen.patch
|
Patch5: b90c4b5f-tests-use-qemu-xen.patch
|
||||||
|
Patch6: fccf2725-libxl-API-4.4.patch
|
||||||
|
Patch7: 5325123d-libxl-migv2-save-restore.patch
|
||||||
|
Patch8: f9edcfa4-libxl-migv2-migration.patch
|
||||||
# Patches pending upstream review
|
# Patches pending upstream review
|
||||||
# Need to go upstream
|
# Need to go upstream
|
||||||
Patch150: xen-pv-cdrom.patch
|
Patch150: xen-pv-cdrom.patch
|
||||||
@ -993,6 +996,9 @@ libvirt plugin for NSS for translating domain names into IP addresses.
|
|||||||
%patch3 -p1
|
%patch3 -p1
|
||||||
%patch4 -p1
|
%patch4 -p1
|
||||||
%patch5 -p1
|
%patch5 -p1
|
||||||
|
%patch6 -p1
|
||||||
|
%patch7 -p1
|
||||||
|
%patch8 -p1
|
||||||
%patch150 -p1
|
%patch150 -p1
|
||||||
%patch151 -p1
|
%patch151 -p1
|
||||||
%patch152 -p1
|
%patch152 -p1
|
||||||
|
Loading…
Reference in New Issue
Block a user