diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 24e29116f2..c5b94295dd 100644 --- a/src/libxl/libxl_conf.h +++ b/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; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 32ad946d48..5fa1bd9f18 100644 --- a/src/libxl/libxl_domain.c +++ b/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(virDomainDefPtr def, libxl_domain_config *d_config) } +#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 driver, virDomainObjPtr vm, 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 driver, virDomainObjPtr vm, &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 driver, virDomainObjPtr vm, 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, diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h index 1c1eba3800..c53adaa1e2 100644 --- a/src/libxl/libxl_domain.h +++ b/src/libxl/libxl_domain.h @@ -142,10 +142,16 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, 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, diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index bf97c9c116..8977ae2cac 100644 --- a/src/libxl/libxl_driver.c +++ b/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, const char *xml, 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 conn, const char *from, 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 dom, 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; diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index ab1f76e32d..1d4ec5ecf2 100644 --- a/src/libxl/libxl_migration.c +++ b/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;