]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Delete thread-context objects at domain startup
authorMichal Privoznik <mprivozn@redhat.com>
Fri, 4 Nov 2022 12:52:43 +0000 (13:52 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 15 Nov 2022 10:54:56 +0000 (11:54 +0100)
While technically thread-context objects can be reused, we only
use them (well, will use them) to pin memory allocation threads.
Therefore, once we connect to QEMU monitor, all memory (with
prealloc=yes) was allocated and thus these objects are no longer
needed and can be removed. For on demand allocation the TC object
is left behind.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_process.c
src/qemu/qemu_process.h

index cf098523d082bb928b3c419355f93d426d25e474..abdbce92dd4056c61a90a2e99cc0f72a9a1a3226 100644 (file)
@@ -3613,6 +3613,7 @@ qemuBuildThreadContextProps(virJSONValue **tcProps,
     g_autoptr(virJSONValue) nodemaskCopy = NULL;
     g_autofree char *tcAlias = NULL;
     const char *memalias = NULL;
+    bool prealloc = false;
 
     *tcProps = NULL;
 
@@ -3645,6 +3646,12 @@ qemuBuildThreadContextProps(virJSONValue **tcProps,
                               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;
 }
index 0d579bfc9b1fa8f64e382de26cbaee2518b34911..ef1a9c8c741adf8eb76a62f90d52f3830e65605c 100644 (file)
@@ -1811,6 +1811,8 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv)
     priv->preMigrationMemlock = 0;
 
     virHashRemoveAll(priv->statsSchema);
+
+    g_slist_free_full(g_steal_pointer(&priv->threadContextAliases), g_free);
 }
 
 
index d5f4fbad12f903bda3f108239ec166a45c6cd2ff..a9af8502d26fb730dfe6654f19c9a9d8908b7d87 100644 (file)
@@ -251,6 +251,8 @@ struct _qemuDomainObjPrivate {
      * 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) \
index 4b26c384cf01fc4a17f5ef45d77d43b8ee609842..0769f30d74dd995b7429487b1dd6d8b4f5970e79 100644 (file)
@@ -7500,6 +7500,50 @@ qemuProcessSetupLifecycleActions(virDomainObj *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:
  *
@@ -7860,6 +7904,9 @@ qemuProcessLaunch(virConnectPtr conn,
     if (qemuProcessSetupLifecycleActions(vm, asyncJob) < 0)
         goto cleanup;
 
+    if (qemuProcessDeleteThreadContextHelper(vm, asyncJob) < 0)
+        goto cleanup;
+
     ret = 0;
 
  cleanup:
index d1f58ee258e295dc782f4531eb505625283e9a5c..9a24745f1579db3714dccb55516ef6b975af8b7e 100644 (file)
@@ -123,6 +123,8 @@ int qemuProcessPrepareHost(virQEMUDriver *driver,
                            virDomainObj *vm,
                            unsigned int flags);
 
+int qemuProcessDeleteThreadContext(virDomainObj *vm);
+
 int qemuProcessLaunch(virConnectPtr conn,
                       virQEMUDriver *driver,
                       virDomainObj *vm,