Markus Groß wrote: > --- > src/libxl/libxl_driver.c | 114 +++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 112 insertions(+), 2 deletions(-) > > diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c > index 4b31197..669c170 100644 > --- a/src/libxl/libxl_driver.c > +++ b/src/libxl/libxl_driver.c > @@ -1041,6 +1041,116 @@ libxlDomainLookupByName(virConnectPtr conn, const char *name) > } > > static int > +libxlDomainSuspend(virDomainPtr dom) > +{ > + libxlDriverPrivatePtr driver = dom->conn->privateData; > + virDomainObjPtr vm; > + libxlDomainObjPrivatePtr priv; > + virDomainEventPtr event = NULL; > + int ret = -1; > + > + libxlDriverLock(driver); > + vm = virDomainFindByUUID(&driver->domains, dom->uuid); > Is there any reason the driver can't be unlocked here? > + > + if (!vm) { > + char uuidstr[VIR_UUID_STRING_BUFLEN]; > + virUUIDFormat(dom->uuid, uuidstr); > + libxlError(VIR_ERR_NO_DOMAIN, > + _("No domain with matching uuid '%s'"), uuidstr); > + goto cleanup; > + } > + if (!virDomainObjIsActive(vm)) { > + libxlError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running")); > + goto cleanup; > + } > + > + priv = vm->privateData; > + > + if (vm->state != VIR_DOMAIN_PAUSED) { > + if (libxl_domain_pause(&priv->ctx, dom->id) != 0) { > + libxlError(VIR_ERR_INTERNAL_ERROR, > + _("Failed to suspend domain '%d' with libxenlight"), > + dom->id); > + goto cleanup; > + } > + > + vm->state = VIR_DOMAIN_PAUSED; > + > + event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_SUSPENDED, > + VIR_DOMAIN_EVENT_SUSPENDED_PAUSED); > Hmm, I need to review patch 1 in this series. I skipped it initially since I'm not yet familiar with the event code. > + } > + > + if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) > + goto cleanup; > + > + ret = 0; > + > +cleanup: > + if (vm) > + virDomainObjUnlock(vm); > + if (event) > + libxlDomainEventQueue(driver, event); > + libxlDriverUnlock(driver); > + return ret; > +} > + > + > +static int > +libxlDomainResume(virDomainPtr dom) > +{ > + libxlDriverPrivatePtr driver = dom->conn->privateData; > + virDomainObjPtr vm; > + libxlDomainObjPrivatePtr priv; > + virDomainEventPtr event = NULL; > + int ret = -1; > + > + libxlDriverLock(driver); > + vm = virDomainFindByUUID(&driver->domains, dom->uuid); > Same question here about unlocking the driver. Regards, Jim > + > + if (!vm) { > + char uuidstr[VIR_UUID_STRING_BUFLEN]; > + virUUIDFormat(dom->uuid, uuidstr); > + libxlError(VIR_ERR_NO_DOMAIN, > + _("No domain with matching uuid '%s'"), uuidstr); > + goto cleanup; > + } > + > + if (!virDomainObjIsActive(vm)) { > + libxlError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running")); > + goto cleanup; > + } > + > + priv = vm->privateData; > + > + if (vm->state == VIR_DOMAIN_PAUSED) { > + if (libxl_domain_unpause(&priv->ctx, dom->id) != 0) { > + libxlError(VIR_ERR_INTERNAL_ERROR, > + _("Failed to resume domain '%d' with libxenlight"), > + dom->id); > + goto cleanup; > + } > + > + vm->state = VIR_DOMAIN_RUNNING; > + > + event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_RESUMED, > + VIR_DOMAIN_EVENT_RESUMED_UNPAUSED); > + } > + > + if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) > + goto cleanup; > + > + ret = 0; > + > +cleanup: > + if (vm) > + virDomainObjUnlock(vm); > + if (event) > + libxlDomainEventQueue(driver, event); > + libxlDriverUnlock(driver); > + return ret; > +} > + > +static int > libxlDomainShutdown(virDomainPtr dom) > { > libxlDriverPrivatePtr driver = dom->conn->privateData; > @@ -2130,8 +2240,8 @@ static virDriver libxlDriver = { > libxlDomainLookupByID, /* domainLookupByID */ > libxlDomainLookupByUUID, /* domainLookupByUUID */ > libxlDomainLookupByName, /* domainLookupByName */ > - NULL, /* domainSuspend */ > - NULL, /* domainResume */ > + libxlDomainSuspend, /* domainSuspend */ > + libxlDomainResume, /* domainResume */ > libxlDomainShutdown, /* domainShutdown */ > libxlDomainReboot, /* domainReboot */ > libxlDomainDestroy, /* domainDestroy */ > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list