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_OPENWSMAN
|
||||
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
|
||||
fi
|
||||
|
||||
@ -26,7 +26,7 @@ Index: libvirt-1.3.4/configure.ac
|
||||
esac
|
||||
|
||||
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_HAL
|
||||
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
|
||||
|
||||
|
@ -464,6 +464,9 @@ Patch2: 538012c8-default-vram.patch
|
||||
Patch3: 96b21fb0-vram-tests.patch
|
||||
Patch4: 400e716d-libxl-noprope-emulator.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
|
||||
# Need to go upstream
|
||||
Patch150: xen-pv-cdrom.patch
|
||||
@ -993,6 +996,9 @@ libvirt plugin for NSS for translating domain names into IP addresses.
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
%patch5 -p1
|
||||
%patch6 -p1
|
||||
%patch7 -p1
|
||||
%patch8 -p1
|
||||
%patch150 -p1
|
||||
%patch151 -p1
|
||||
%patch152 -p1
|
||||
|
Loading…
Reference in New Issue
Block a user