libxlDomainEventQueue(driver, dom_event);
dom_event = NULL;
}
- libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
+ libxlDomainDestroyInternal(driver, vm);
libxlDomainCleanup(driver, vm, reason);
if (!vm->persistent)
virDomainObjListRemove(driver->domains, vm);
libxlDomainEventQueue(driver, dom_event);
dom_event = NULL;
}
- libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
+ libxlDomainDestroyInternal(driver, vm);
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
if (libxlDomainStart(driver, vm, false, -1) < 0) {
virErrorPtr err = virGetLastError();
return -1;
}
+/*
+ * Internal domain destroy function.
+ *
+ * virDomainObjPtr must be locked on invocation
+ */
+int
+libxlDomainDestroyInternal(libxlDriverPrivatePtr driver,
+ virDomainObjPtr vm)
+{
+ libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
+ int ret = -1;
+
+ /* Unlock virDomainObj during destroy, which can take considerable
+ * time on large memory domains.
+ */
+ virObjectUnlock(vm);
+ ret = libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
+ virObjectLock(vm);
+
+ virObjectUnref(cfg);
+ return ret;
+}
+
/*
* Cleanup function for domain that has reached shutoff state.
*
libxl_evdisable_domain_death(cfg->ctx, priv->deathW);
priv->deathW = NULL;
}
- libxl_domain_destroy(cfg->ctx, domid, NULL);
+ libxlDomainDestroyInternal(driver, vm);
vm->def->id = -1;
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_FAILED);
libxlSavefileHeaderPtr ret_hdr)
ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5);
+int
+libxlDomainDestroyInternal(libxlDriverPrivatePtr driver,
+ virDomainObjPtr vm);
+
void
libxlDomainCleanup(libxlDriverPrivatePtr driver,
virDomainObjPtr vm,
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
- if (libxl_domain_destroy(cfg->ctx, vm->def->id, NULL) < 0) {
+ if (libxlDomainDestroyInternal(driver, vm) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to destroy domain '%d'"), vm->def->id);
goto endjob;
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_SAVED);
- if (libxl_domain_destroy(cfg->ctx, vm->def->id, NULL) < 0) {
+ if (libxlDomainDestroyInternal(driver, vm) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to destroy domain '%d'"), vm->def->id);
goto cleanup;
}
if (flags & VIR_DUMP_CRASH) {
- if (libxl_domain_destroy(cfg->ctx, vm->def->id, NULL) < 0) {
+ if (libxlDomainDestroyInternal(driver, vm) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to destroy domain '%d'"), vm->def->id);
goto unpause;
cleanup:
if (dom == NULL) {
- libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
+ libxlDomainDestroyInternal(driver, vm);
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_FAILED);
goto cleanup;
}
- libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
+ libxlDomainDestroyInternal(driver, vm);
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_MIGRATED);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_MIGRATED);