Daniel P. Berrange wrote: > On Thu, May 08, 2014 at 03:56:51PM -0600, Jim Fehlig wrote: > >> This patch adds initial migration support to the libxl driver, >> using the VIR_DRV_FEATURE_MIGRATION_PARAMS family of migration >> functions. >> >> Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxx> >> --- >> >> V6 here >> https://www.redhat.com/archives/libvir-list/2014-May/msg00017.html >> >> In V7: >> There were no comments on V6, but during testing I noticed that >> 'virsh migrate --suspend ...' was not being honored. Fixed that >> in this version so that the domain is paused on the destination >> once migration completes. >> >> po/POTFILES.in | 1 + >> src/Makefile.am | 3 +- >> src/libxl/libxl_conf.h | 6 + >> src/libxl/libxl_domain.h | 1 + >> src/libxl/libxl_driver.c | 235 ++++++++++++++++++ >> src/libxl/libxl_migration.c | 581 ++++++++++++++++++++++++++++++++++++++++++++ >> src/libxl/libxl_migration.h | 79 ++++++ >> 7 files changed, 905 insertions(+), 1 deletion(-) >> > > > >> @@ -301,6 +303,13 @@ libxlStateInitialize(bool privileged, >> LIBXL_VNC_PORT_MAX))) >> goto error; >> >> + /* Allocate bitmap for migration port reservation */ >> + if (!(libxl_driver->migrationPorts = >> + virPortAllocatorNew(_("migration"), >> + LIBXL_MIGRATION_PORT_MIN, >> + LIBXL_MIGRATION_PORT_MAX))) >> + goto error; >> + >> > > No need todo it in this patch, but experiance with QEMU is that people will > want this range to be configurable in /etc/libvirt/libxl.conf. So I'd > suggest adding this later > Nod. I have an old, dusty patchset that integrates virlockd in the libxl driver. The series includes introducing a conf file for the libxl driver. I'll get back to working on that before long. > >> diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c >> new file mode 100644 >> index 0000000..e3699c5 >> --- /dev/null >> +++ b/src/libxl/libxl_migration.c >> @@ -0,0 +1,581 @@ >> +/* >> + * libxl_migration.c: methods for handling migration with libxenlight >> + * >> + * Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. >> + * >> + * This library is free software; you can redistribute it and/or >> + * modify it under the terms of the GNU Lesser General Public >> + * License as published by the Free Software Foundation; either >> + * version 2.1 of the License, or (at your option) any later version. >> + * >> + * This library is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> + * Lesser General Public License for more details. >> + * >> + * You should have received a copy of the GNU Lesser General Public >> + * License along with this library. If not, see >> + * <http://www.gnu.org/licenses/>. >> + * >> + * Authors: >> + * Jim Fehlig <jfehlig@xxxxxxxx> >> + * Chunyan Liu <cyliu@xxxxxxxx> >> + */ >> + >> +#include <config.h> >> + >> +#include "internal.h" >> +#include "virlog.h" >> +#include "virerror.h" >> +#include "virconf.h" >> +#include "datatypes.h" >> +#include "virfile.h" >> +#include "viralloc.h" >> +#include "viruuid.h" >> +#include "vircommand.h" >> +#include "virstring.h" >> +#include "virobject.h" >> +#include "rpc/virnetsocket.h" >> +#include "libxl_domain.h" >> +#include "libxl_driver.h" >> +#include "libxl_conf.h" >> +#include "libxl_migration.h" >> + >> +#define VIR_FROM_THIS VIR_FROM_LIBXL >> + >> +VIR_LOG_INIT("libxl.libxl_migration"); >> + >> +typedef struct _libxlMigrationDstArgs { >> + virObject parent; >> + >> + virConnectPtr conn; >> + virDomainObjPtr vm; >> + unsigned int flags; >> + >> + /* for freeing listen sockets */ >> + virNetSocketPtr *socks; >> + size_t nsocks; >> +} libxlMigrationDstArgs; >> + >> +static virClassPtr libxlMigrationDstArgsClass; >> + >> +static void >> +libxlMigrationDstArgsDispose(void *obj) >> +{ >> + libxlMigrationDstArgs *args = obj; >> + >> + VIR_FREE(args->socks); >> +} >> + >> +static int >> +libxlMigrationDstArgsOnceInit(void) >> +{ >> + if (!(libxlMigrationDstArgsClass = virClassNew(virClassForObject(), >> + "libxlMigrationDstArgs", >> + sizeof(libxlMigrationDstArgs), >> + libxlMigrationDstArgsDispose))) >> + return -1; >> + >> + return 0; >> +} >> + >> +VIR_ONCE_GLOBAL_INIT(libxlMigrationDstArgs) >> + >> +static void >> +libxlDoMigrateReceive(virNetSocketPtr sock, >> + int events ATTRIBUTE_UNUSED, >> + void *opaque) >> +{ >> + libxlMigrationDstArgs *args = opaque; >> + virConnectPtr conn = args->conn; >> + virDomainObjPtr vm = args->vm; >> + virNetSocketPtr *socks = args->socks; >> + size_t nsocks = args->nsocks; >> + bool paused = args->flags & VIR_MIGRATE_PAUSED; >> + libxlDriverPrivatePtr driver = conn->privateData; >> + virNetSocketPtr client_sock; >> + int recvfd = -1; >> + size_t i; >> + int ret; >> + >> + virNetSocketAccept(sock, &client_sock); >> + if (client_sock == NULL) { >> + virReportError(VIR_ERR_OPERATION_INVALID, "%s", >> + _("Fail to accept migration connection")); >> + goto cleanup; >> + } >> + VIR_DEBUG("Accepted migration connection\n"); >> + recvfd = virNetSocketDupFD(client_sock, true); >> + virObjectUnref(client_sock); >> + >> + virObjectLock(vm); >> + ret = libxlDomainStart(driver, vm, paused, recvfd); >> + virObjectUnlock(vm); >> + >> + if (ret < 0 && !vm->persistent) >> + virDomainObjListRemove(driver->domains, vm); >> + >> + cleanup: >> + /* Remove all listen socks from event handler, and close them. */ >> + for (i = 0; i < nsocks; i++) { >> + virNetSocketUpdateIOCallback(socks[i], 0); >> + virNetSocketRemoveIOCallback(socks[i]); >> + virNetSocketClose(socks[i]); >> + virObjectUnref(socks[i]); >> > > I think you should set socks[i] = NULL and after the loop also set > args->nsocks = 0, just to ensure nothing else can access these now > free'd socks. > Ok, done in V8. > > >> +char * >> +libxlDomainMigrationBegin(virConnectPtr conn, >> + virDomainObjPtr vm, >> + const char *xmlin) >> +{ >> + libxlDriverPrivatePtr driver = conn->privateData; >> + libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); >> + virDomainDefPtr tmpdef = NULL; >> + virDomainDefPtr def; >> + char *xml = NULL; >> + >> + if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0) >> + goto cleanup; >> + >> + if (xmlin) { >> + if (!(tmpdef = virDomainDefParseString(xmlin, cfg->caps, >> + driver->xmlopt, >> + 1 << VIR_DOMAIN_VIRT_XEN, >> + VIR_DOMAIN_XML_INACTIVE))) >> + goto endjob; >> > > I think you want to call an equivalent of qemuDomainDefCheckABIStability > here. THis ensures the user supplied XML only contains changes that are > not going to impact guest machine ABI. > V8 includes a simple libxlDomainDefCheckABIStability() function https://www.redhat.com/archives/libvir-list/2014-June/msg00231.html Thanks for the comments! Regards, Jim -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list