Daniel P. Berrange wrote: > On Fri, Apr 17, 2015 at 03:36:22PM -0600, Jim Fehlig wrote: > >> Provide integration with libvirt's lock manager in the libxl driver. >> >> Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxx> >> --- >> src/Makefile.am | 12 +++++++++ >> src/libxl/libvirtd_libxl.aug | 2 ++ >> src/libxl/libxl.conf | 10 ++++++++ >> src/libxl/libxl_conf.c | 14 +++++++++++ >> src/libxl/libxl_conf.h | 6 +++++ >> src/libxl/libxl_domain.c | 47 ++++++++++++++++++++++++++++++++++-- >> src/libxl/libxl_domain.h | 1 + >> src/libxl/libxl_driver.c | 25 +++++++++++++++++++ >> src/libxl/libxl_migration.c | 6 +++++ >> src/libxl/test_libvirtd_libxl.aug.in | 1 + >> 10 files changed, 122 insertions(+), 2 deletions(-) >> >> diff --git a/src/Makefile.am b/src/Makefile.am >> index 9a5f16c..1438174 100644 >> --- a/src/Makefile.am >> +++ b/src/Makefile.am >> @@ -2246,6 +2246,12 @@ BUILT_SOURCES += locking/qemu-lockd.conf >> DISTCLEANFILES += locking/qemu-lockd.conf >> endif WITH_QEMU >> >> +if WITH_LIBXL >> +nodist_conf_DATA += locking/libxl-lockd.conf >> +BUILT_SOURCES += locking/libxl-lockd.conf >> +DISTCLEANFILES += locking/libxl-lockd.conf >> +endif WITH_LIBXL >> + >> locking/%-lockd.conf: $(srcdir)/locking/lockd.conf >> $(AM_V_GEN)$(MKDIR_P) locking ; \ >> cp $< $@ >> @@ -2431,6 +2437,12 @@ nodist_conf_DATA += locking/qemu-sanlock.conf >> BUILT_SOURCES += locking/qemu-sanlock.conf >> DISTCLEANFILES += locking/qemu-sanlock.conf >> endif WITH_QEMU >> + >> +if WITH_LIBXL >> +nodist_conf_DATA += locking/libxl-sanlock.conf >> +BUILT_SOURCES += locking/libxl-sanlock.conf >> +DISTCLEANFILES += locking/libxl-sanlock.conf >> +endif WITH_LIBXL >> else ! WITH_SANLOCK >> EXTRA_DIST += $(LOCK_DRIVER_SANLOCK_SOURCES) >> endif ! WITH_SANLOCK >> diff --git a/src/libxl/libvirtd_libxl.aug b/src/libxl/libvirtd_libxl.aug >> index f225954..d5aa150 100644 >> --- a/src/libxl/libvirtd_libxl.aug >> +++ b/src/libxl/libvirtd_libxl.aug >> @@ -25,9 +25,11 @@ module Libvirtd_libxl = >> >> (* Config entry grouped by function - same order as example config *) >> let autoballoon_entry = bool_entry "autoballoon" >> + let lock_entry = str_entry "lock_manager" >> >> (* Each entry in the config is one of the following ... *) >> let entry = autoballoon_entry >> + | lock_entry >> >> let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ] >> let empty = [ label "#empty" . eol ] >> diff --git a/src/libxl/libxl.conf b/src/libxl/libxl.conf >> index c104d40..ba3de7a 100644 >> --- a/src/libxl/libxl.conf >> +++ b/src/libxl/libxl.conf >> @@ -10,3 +10,13 @@ >> # autoballoon setting. >> # >> #autoballoon = 1 >> + >> + >> +# In order to prevent accidentally starting two domains that >> +# share one writable disk, libvirt offers two approaches for >> +# locking files: sanlock and virtlockd. sanlock is an external >> +# project which libvirt integrates with via the libvirt-lock-sanlock >> +# package. virtlockd is a libvirt implementation that is enabled with >> +# "lockd". Accepted values are "sanlock" and "lockd". >> +# >> +#lock_manager = "lockd" >> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c >> index 6ea2889..503e8a4 100644 >> --- a/src/libxl/libxl_conf.c >> +++ b/src/libxl/libxl_conf.c >> @@ -102,6 +102,7 @@ libxlDriverConfigDispose(void *obj) >> VIR_FREE(cfg->libDir); >> VIR_FREE(cfg->saveDir); >> VIR_FREE(cfg->autoDumpDir); >> + VIR_FREE(cfg->lockManagerName); >> } >> >> >> @@ -1495,6 +1496,7 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg, >> const char *filename) >> { >> virConfPtr conf = NULL; >> + virConfValuePtr p; >> int ret = -1; >> >> /* Check the file is readable before opening it, otherwise >> @@ -1512,6 +1514,18 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg, >> if (libxlGetAutoballoonConf(cfg, conf) < 0) >> goto cleanup; >> >> + if ((p = virConfGetValue(conf, "lock_manager"))) { >> + if (p->type != VIR_CONF_STRING) { >> + virReportError(VIR_ERR_INTERNAL_ERROR, >> + "%s", >> + _("Unexpected type for 'lock_manager' setting")); >> + goto cleanup; >> + } >> + >> + if (VIR_STRDUP(cfg->lockManagerName, p->str) < 0) >> + goto cleanup; >> + } >> + >> ret = 0; >> >> cleanup: >> diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h >> index 5ba1a71..0a1c0db 100644 >> --- a/src/libxl/libxl_conf.h >> +++ b/src/libxl/libxl_conf.h >> @@ -38,6 +38,7 @@ >> # include "virobject.h" >> # include "virchrdev.h" >> # include "virhostdev.h" >> +# include "locking/lock_manager.h" >> >> # define LIBXL_DRIVER_NAME "xenlight" >> # define LIBXL_VNC_PORT_MIN 5900 >> @@ -98,6 +99,8 @@ struct _libxlDriverConfig { >> * memory for new domains from domain0. */ >> bool autoballoon; >> >> + char *lockManagerName; >> + >> /* Once created, caps are immutable */ >> virCapsPtr caps; >> >> @@ -144,6 +147,9 @@ struct _libxlDriverPrivate { >> >> /* Immutable pointer, lockless APIs*/ >> virSysinfoDefPtr hostsysinfo; >> + >> + /* Immutable pointer. lockless access */ >> + virLockManagerPluginPtr lockManager; >> }; >> >> # define LIBXL_SAVE_MAGIC "libvirt-xml\n \0 \r" >> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c >> index 77d46d0..70247f5 100644 >> --- a/src/libxl/libxl_domain.c >> +++ b/src/libxl/libxl_domain.c >> @@ -34,6 +34,7 @@ >> #include "virlog.h" >> #include "virstring.h" >> #include "virtime.h" >> +#include "locking/domain_lock.h" >> >> #define VIR_FROM_THIS VIR_FROM_LIBXL >> >> @@ -217,12 +218,36 @@ libxlDomainObjPrivateFree(void *data) >> { >> libxlDomainObjPrivatePtr priv = data; >> >> + VIR_FREE(priv->lockState); >> virObjectUnref(priv); >> } >> >> +static int >> +libxlDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, void *data) >> +{ >> + libxlDomainObjPrivatePtr priv = data; >> + >> + priv->lockState = virXPathString("string(./lockstate)", ctxt); >> + >> + return 0; >> +} >> + >> +static int >> +libxlDomainObjPrivateXMLFormat(virBufferPtr buf, void *data) >> +{ >> + libxlDomainObjPrivatePtr priv = data; >> + >> + if (priv->lockState) >> + virBufferAsprintf(buf, "<lockstate>%s</lockstate>\n", priv->lockState); >> + >> + return 0; >> +} >> + >> virDomainXMLPrivateDataCallbacks libxlDomainXMLPrivateDataCallbacks = { >> .alloc = libxlDomainObjPrivateAlloc, >> .free = libxlDomainObjPrivateFree, >> + .parse = libxlDomainObjPrivateXMLParse, >> + .format = libxlDomainObjPrivateXMLFormat, >> }; >> >> >> @@ -668,6 +693,11 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver, >> virHostdevReAttachDomainDevices(hostdev_mgr, LIBXL_DRIVER_NAME, >> vm->def, VIR_HOSTDEV_SP_PCI, NULL); >> >> + VIR_FREE(priv->lockState); >> + if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0) >> + VIR_WARN("Unable to release lease on %s", vm->def->name); >> + VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState)); >> > > I see a few calls to ProcessPause, but I'm not seeing any to ProcessResume, > so I think you might have missed a few places needing hooks. > Currently I'm not using ProcessResume and instead calling ProcessStart with paused param set to false. ProcessStart is called in libxlDomainStart, which is called by all paths that start a domain, e.g. start, create, restore, migrate, etc. I was under the impression that ProcessResume is not needed if ProcessStart is called with paused=false. Regards, Jim -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list