g_autoptr(virJSONValue) nodemaskCopy = NULL;
g_autofree char *tcAlias = NULL;
const char *memalias = NULL;
+ bool prealloc = false;
*tcProps = NULL;
NULL) < 0)
return -1;
+ if (virJSONValueObjectGetBoolean(*memProps, "prealloc", &prealloc) >= 0 &&
+ prealloc) {
+ priv->threadContextAliases = g_slist_prepend(priv->threadContextAliases,
+ g_steal_pointer(&tcAlias));
+ }
+
*tcProps = g_steal_pointer(&props);
return 0;
}
priv->preMigrationMemlock = 0;
virHashRemoveAll(priv->statsSchema);
+
+ g_slist_free_full(g_steal_pointer(&priv->threadContextAliases), g_free);
}
* briefly when starting a guest. Don't save/parse into XML. */
pid_t schedCoreChildPID;
pid_t schedCoreChildFD;
+
+ GSList *threadContextAliases; /* List of IDs of thread-context objects */
};
#define QEMU_DOMAIN_PRIVATE(vm) \
}
+int
+qemuProcessDeleteThreadContext(virDomainObj *vm)
+{
+ qemuDomainObjPrivate *priv = vm->privateData;
+ GSList *next = priv->threadContextAliases;
+ int ret = -1;
+
+ if (!next)
+ return 0;
+
+ for (; next; next = next->next) {
+ if (qemuMonitorDelObject(priv->mon, next->data, true) < 0)
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ g_slist_free_full(g_steal_pointer(&priv->threadContextAliases), g_free);
+ return ret;
+}
+
+
+static int
+qemuProcessDeleteThreadContextHelper(virDomainObj *vm,
+ virDomainAsyncJob asyncJob)
+{
+ qemuDomainObjPrivate *priv = vm->privateData;
+ int ret = -1;
+
+ if (!priv->threadContextAliases)
+ return 0;
+
+ VIR_DEBUG("Deleting thread context objects");
+ if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
+ return -1;
+
+ ret = qemuProcessDeleteThreadContext(vm);
+
+ qemuDomainObjExitMonitor(vm);
+
+ return ret;
+}
+
+
/**
* qemuProcessLaunch:
*
if (qemuProcessSetupLifecycleActions(vm, asyncJob) < 0)
goto cleanup;
+ if (qemuProcessDeleteThreadContextHelper(vm, asyncJob) < 0)
+ goto cleanup;
+
ret = 0;
cleanup: