diff --git a/5325123d-libxl-migv2-save-restore.patch b/5325123d-libxl-migv2-save-restore.patch new file mode 100644 index 0000000..6cffa33 --- /dev/null +++ b/5325123d-libxl-migv2-save-restore.patch @@ -0,0 +1,227 @@ +commit 5325123d235deb07f39b73c06a7d9ab6494fa2c8 +Author: Jim Fehlig +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 + +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; diff --git a/f9edcfa4-libxl-migv2-migration.patch b/f9edcfa4-libxl-migv2-migration.patch new file mode 100644 index 0000000..48c0b63 --- /dev/null +++ b/f9edcfa4-libxl-migv2-migration.patch @@ -0,0 +1,392 @@ +commit f9edcfa47396fdaab69ed72f0d5e0b751aa014fa +Author: Jim Fehlig +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 + +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, "\n"); ++ virBufferAdjustIndent(&buf, 2); ++ virBufferEscapeString(&buf, "%s\n", mig->name); ++ virBufferAsprintf(&buf, "%s\n", uuidstr); ++ virBufferEscapeString(&buf, "%s\n", mig->srcHostname); ++ virBufferAsprintf(&buf, "%u\n", mig->xenMigStreamVer); ++ virBufferAdjustIndent(&buf, -2); ++ virBufferAddLit(&buf, "\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 diff --git a/fccf2725-libxl-API-4.4.patch b/fccf2725-libxl-API-4.4.patch new file mode 100644 index 0000000..5443a53 --- /dev/null +++ b/fccf2725-libxl-API-4.4.patch @@ -0,0 +1,58 @@ +commit fccf27253cedd131c5c4720d31d96ecc68c20e59 +Author: Jim Fehlig +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 + +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); + diff --git a/libvirt-suse-netcontrol.patch b/libvirt-suse-netcontrol.patch index 615d06d..0daacc3 100644 --- a/libvirt-suse-netcontrol.patch +++ b/libvirt-suse-netcontrol.patch @@ -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 diff --git a/libvirt.changes b/libvirt.changes index 6b51727..4c0b997 100644 --- a/libvirt.changes +++ b/libvirt.changes @@ -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 diff --git a/libvirt.spec b/libvirt.spec index 89c1768..8c98f65 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -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