]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Use new connection close callbacks API
authorPeter Krempa <pkrempa@redhat.com>
Mon, 29 Aug 2022 15:08:57 +0000 (17:08 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 6 Jan 2023 14:30:09 +0000 (15:30 +0100)
The qemu driver uses connection close callbacks in more places requiring
more changes than other drivers, but luckily the changes are very
straightforward. The migration code was written in a way ensuring that
there's just one callback present so this can be preserved directly.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/qemu/qemu_conf.c
src/qemu/qemu_conf.h
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_process.c
src/qemu/qemu_process.h

index 6760bef14cfe5add3173a35a3e3daed294b5ceee..618ed78d63ab103b0dde18156aaaaf662a7eb806 100644 (file)
@@ -1311,17 +1311,22 @@ virQEMUDriverCreateXMLConf(virQEMUDriver *driver,
                            const char *defsecmodel)
 {
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+    virDomainXMLOption *ret = NULL;
 
     virQEMUDriverDomainDefParserConfig.priv = driver;
     virQEMUDriverDomainDefParserConfig.defSecModel = defsecmodel;
     virQEMUDriverDomainJobConfig.maxQueuedJobs = cfg->maxQueuedJobs;
 
-    return virDomainXMLOptionNew(&virQEMUDriverDomainDefParserConfig,
-                                 &virQEMUDriverPrivateDataCallbacks,
-                                 &virQEMUDriverDomainXMLNamespace,
-                                 &virQEMUDriverDomainABIStability,
-                                 &virQEMUDriverDomainSaveCookie,
-                                 &virQEMUDriverDomainJobConfig);
+    ret = virDomainXMLOptionNew(&virQEMUDriverDomainDefParserConfig,
+                                &virQEMUDriverPrivateDataCallbacks,
+                                &virQEMUDriverDomainXMLNamespace,
+                                &virQEMUDriverDomainABIStability,
+                                &virQEMUDriverDomainSaveCookie,
+                                &virQEMUDriverDomainJobConfig);
+
+    virDomainXMLOptionSetCloseCallbackAlloc(ret, virCloseCallbacksDomainAlloc);
+
+    return ret;
 }
 
 
index 8cf2dd2ec5f3819cfad9810e99c51c68ec922052..b7ed00ca41af80df81c02a210e45b33ba8e3de18 100644 (file)
@@ -314,9 +314,6 @@ struct _virQEMUDriver {
     /* Immutable pointer. lockless access */
     virLockManagerPlugin *lockManager;
 
-    /* Immutable pointer, self-clocking APIs */
-    virCloseCallbacks *closeCallbacks;
-
     /* Immutable pointer, self-locking APIs */
     virHashAtomic *migrationErrors;
 };
index 1c74ea96bce0152cef7e9d4952a230b2cb87359e..6a012754d5c60200a9a86ca0d5ed927ee95cea39 100644 (file)
@@ -846,9 +846,6 @@ qemuStateInitialize(bool privileged,
                           0, S_IXGRP | S_IXOTH) < 0)
         goto error;
 
-    if (!(qemu_driver->closeCallbacks = virCloseCallbacksNew()))
-        goto error;
-
     /* Get all the running persistent or transient configs first */
     if (virDomainObjListLoadAllConfigs(qemu_driver->domains,
                                        cfg->stateDir,
@@ -1053,7 +1050,6 @@ qemuStateCleanup(void)
         return -1;
 
     virObjectUnref(qemu_driver->migrationErrors);
-    virObjectUnref(qemu_driver->closeCallbacks);
     virLockManagerPluginUnref(qemu_driver->lockManager);
     virSysinfoDefFree(qemu_driver->hostsysinfo);
     virPortAllocatorRangeFree(qemu_driver->migrationPorts);
@@ -1146,9 +1142,7 @@ static int qemuConnectClose(virConnectPtr conn)
 {
     virQEMUDriver *driver = conn->privateData;
 
-    /* Get rid of callbacks registered for this conn */
-    virCloseCallbacksRun(driver->closeCallbacks, conn, driver->domains);
-
+    virCloseCallbacksDomainRunForConn(driver->domains, conn);
     conn->privateData = NULL;
 
     return 0;
index f4441d61ae7be93e23279905a36cae085453a6a6..61a2bc39c48545ccb560ecd218999f94abfa1a88 100644 (file)
@@ -1371,7 +1371,7 @@ qemuDomainGetMigrationBlockers(virDomainObj *vm,
  * false otherwise.
  */
 bool
-qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
+qemuMigrationSrcIsAllowed(virQEMUDriver *driver G_GNUC_UNUSED,
                           virDomainObj *vm,
                           bool remote,
                           int asyncJob,
@@ -1437,7 +1437,7 @@ qemuMigrationSrcIsAllowed(virQEMUDriver *driver,
                 return false;
             }
 
-            if (qemuProcessAutoDestroyActive(driver, vm)) {
+            if (virCloseCallbacksDomainIsRegistered(vm, NULL, qemuProcessAutoDestroy)) {
                 virReportError(VIR_ERR_OPERATION_INVALID,
                                "%s", _("domain is marked for auto destroy"));
                 return false;
@@ -2735,7 +2735,7 @@ qemuMigrationSrcBeginResume(virDomainObj *vm,
 
 static char *
 qemuMigrationSrcBeginResumePhase(virConnectPtr conn,
-                                 virQEMUDriver *driver,
+                                 virQEMUDriver *driver G_GNUC_UNUSED,
                                  virDomainObj *vm,
                                  const char *xmlin,
                                  char **cookieout,
@@ -2753,15 +2753,12 @@ qemuMigrationSrcBeginResumePhase(virConnectPtr conn,
     if (qemuMigrationJobStartPhase(vm, QEMU_MIGRATION_PHASE_BEGIN_RESUME) < 0)
         return NULL;
 
-    virCloseCallbacksUnset(driver->closeCallbacks, vm,
-                           qemuMigrationAnyConnectionClosed);
+    virCloseCallbacksDomainRemove(vm, NULL, qemuMigrationAnyConnectionClosed);
     qemuDomainCleanupRemove(vm, qemuProcessCleanupMigrationJob);
 
     xml = qemuMigrationSrcBeginResume(vm, xmlin, cookieout, cookieoutlen, flags);
 
-    if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
-                             qemuMigrationAnyConnectionClosed) < 0)
-        g_clear_pointer(&xml, g_free);
+    virCloseCallbacksDomainAdd(vm, conn, qemuMigrationAnyConnectionClosed);
 
     if (!xml)
         ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
@@ -2837,9 +2834,7 @@ qemuMigrationSrcBegin(virConnectPtr conn,
          * This prevents any other APIs being invoked while migration is taking
          * place.
          */
-        if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
-                                 qemuMigrationAnyConnectionClosed) < 0)
-            goto endjob;
+        virCloseCallbacksDomainAdd(vm, conn, qemuMigrationAnyConnectionClosed);
     }
 
     ret = g_steal_pointer(&xml);
@@ -3490,8 +3485,7 @@ qemuMigrationDstPrepareResume(virQEMUDriver *driver,
                                   QEMU_MIGRATION_COOKIE_CAPS) < 0)
         VIR_WARN("Unable to encode migration cookie");
 
-    virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
-                         qemuMigrationAnyConnectionClosed);
+    virCloseCallbacksDomainAdd(vm, conn, qemuMigrationAnyConnectionClosed);
 
     if (autoPort)
         priv->migrationPort = port;
@@ -4031,8 +4025,7 @@ qemuMigrationSrcConfirm(virQEMUDriver *driver,
     if (qemuMigrationJobStartPhase(vm, phase) < 0)
         goto cleanup;
 
-    virCloseCallbacksUnset(driver->closeCallbacks, vm,
-                           qemuMigrationAnyConnectionClosed);
+    virCloseCallbacksDomainRemove(vm, NULL, qemuMigrationAnyConnectionClosed);
     qemuDomainCleanupRemove(vm, qemuProcessCleanupMigrationJob);
 
     ret = qemuMigrationSrcConfirmPhase(driver, vm,
@@ -5285,8 +5278,7 @@ qemuMigrationSrcPerformResume(virQEMUDriver *driver,
     if (qemuMigrationJobStartPhase(vm, QEMU_MIGRATION_PHASE_PERFORM_RESUME) < 0)
         return -1;
 
-    virCloseCallbacksUnset(driver->closeCallbacks, vm,
-                           qemuMigrationAnyConnectionClosed);
+    virCloseCallbacksDomainRemove(vm, NULL, qemuMigrationAnyConnectionClosed);
     qemuDomainCleanupRemove(vm, qemuProcessCleanupMigrationJob);
 
     ret = qemuMigrationSrcPerformNative(driver, vm, NULL, uri,
@@ -5294,9 +5286,7 @@ qemuMigrationSrcPerformResume(virQEMUDriver *driver,
                                         cookieout, cookieoutlen, flags,
                                         0, NULL, NULL, 0, NULL, migParams, NULL);
 
-    if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
-                             qemuMigrationAnyConnectionClosed) < 0)
-        ret = -1;
+    virCloseCallbacksDomainAdd(vm, conn, qemuMigrationAnyConnectionClosed);
 
     if (ret < 0)
         ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
@@ -6034,8 +6024,7 @@ qemuMigrationSrcPerformJob(virQEMUDriver *driver,
         if (qemuMigrationJobStartPhase(vm, QEMU_MIGRATION_PHASE_BEGIN_RESUME) < 0)
             goto cleanup;
 
-        virCloseCallbacksUnset(driver->closeCallbacks, vm,
-                               qemuMigrationAnyConnectionClosed);
+        virCloseCallbacksDomainRemove(vm, NULL, qemuMigrationAnyConnectionClosed);
         qemuDomainCleanupRemove(vm, qemuProcessCleanupMigrationJob);
     } else {
         if (qemuMigrationJobStart(vm, VIR_ASYNC_JOB_MIGRATION_OUT,
@@ -6167,8 +6156,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriver *driver,
     if (qemuMigrationJobStartPhase(vm, QEMU_MIGRATION_PHASE_PERFORM3) < 0)
         goto cleanup;
 
-    virCloseCallbacksUnset(driver->closeCallbacks, vm,
-                           qemuMigrationAnyConnectionClosed);
+    virCloseCallbacksDomainRemove(vm, NULL, qemuMigrationAnyConnectionClosed);
 
     if (qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri, cookiein, cookieinlen,
                                       cookieout, cookieoutlen,
@@ -6176,9 +6164,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriver *driver,
                                       nmigrate_disks, migrate_disks, migParams, nbdURI) < 0)
         goto cleanup;
 
-    if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
-                             qemuMigrationAnyConnectionClosed) < 0)
-        goto cleanup;
+    virCloseCallbacksDomainAdd(vm, conn, qemuMigrationAnyConnectionClosed);
 
     ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_PERFORM3_DONE));
     ret = 0;
@@ -6434,7 +6420,7 @@ qemuMigrationDstComplete(virQEMUDriver *driver,
      * nothing to remove when we are resuming post-copy migration.
      */
     if (job->phase < QEMU_MIGRATION_PHASE_POSTCOPY_FAILED)
-        qemuProcessAutoDestroyRemove(driver, vm);
+        virCloseCallbacksDomainRemove(vm, NULL, qemuProcessAutoDestroy);
 
     /* Remove completed stats for post-copy, everything but timing fields
      * is obsolete anyway.
@@ -6727,7 +6713,7 @@ qemuMigrationDstFinishActive(virQEMUDriver *driver,
 
     if (virDomainObjIsFailedPostcopy(vm)) {
         ignore_value(qemuMigrationJobSetPhase(vm, QEMU_MIGRATION_PHASE_POSTCOPY_FAILED));
-        qemuProcessAutoDestroyRemove(driver, vm);
+        virCloseCallbacksDomainRemove(vm, NULL, qemuProcessAutoDestroy);
         *finishJob = false;
     } else {
         qemuMigrationParamsReset(vm, VIR_ASYNC_JOB_MIGRATION_IN,
@@ -6787,8 +6773,7 @@ qemuMigrationDstFinish(virQEMUDriver *driver,
         goto cleanup;
 
     if (flags & VIR_MIGRATE_POSTCOPY_RESUME) {
-        virCloseCallbacksUnset(driver->closeCallbacks, vm,
-                               qemuMigrationAnyConnectionClosed);
+        virCloseCallbacksDomainRemove(vm, NULL, qemuMigrationAnyConnectionClosed);
         qemuDomainCleanupRemove(vm, qemuProcessCleanupMigrationJob);
     } else {
         qemuDomainCleanupRemove(vm, qemuMigrationDstPrepareCleanup);
index 04d14e7eb079799df10c7c7409a19a5e83a02a3b..644fa9724ade4a1cf31c179e8ed3dabe814d393b 100644 (file)
@@ -7901,9 +7901,8 @@ qemuProcessLaunch(virConnectPtr conn,
         qemuProcessRefreshBalloonState(vm, asyncJob) < 0)
         goto cleanup;
 
-    if (flags & VIR_QEMU_PROCESS_START_AUTODESTROY &&
-        qemuProcessAutoDestroyAdd(driver, vm, conn) < 0)
-        goto cleanup;
+    if (flags & VIR_QEMU_PROCESS_START_AUTODESTROY)
+        virCloseCallbacksDomainAdd(vm, conn, qemuProcessAutoDestroy);
 
     if (!incoming && !snapshot) {
         VIR_DEBUG("Setting up transient disk");
@@ -8381,7 +8380,7 @@ void qemuProcessStop(virQEMUDriver *driver,
     virFileDeleteTree(priv->channelTargetDir);
 
     /* Stop autodestroy in case guest is restarted */
-    qemuProcessAutoDestroyRemove(driver, vm);
+    virCloseCallbacksDomainRemove(vm, NULL, qemuProcessAutoDestroy);
 
     /* now that we know it's stopped call the hook if present */
     if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
@@ -8601,7 +8600,7 @@ void qemuProcessStop(virQEMUDriver *driver,
 }
 
 
-static void
+void
 qemuProcessAutoDestroy(virDomainObj *dom,
                        virConnectPtr conn)
 {
@@ -8641,32 +8640,6 @@ qemuProcessAutoDestroy(virDomainObj *dom,
     virObjectEventStateQueue(driver->domainEventState, event);
 }
 
-int qemuProcessAutoDestroyAdd(virQEMUDriver *driver,
-                              virDomainObj *vm,
-                              virConnectPtr conn)
-{
-    VIR_DEBUG("vm=%s, conn=%p", vm->def->name, conn);
-    return virCloseCallbacksSet(driver->closeCallbacks, vm, conn,
-                                qemuProcessAutoDestroy);
-}
-
-int qemuProcessAutoDestroyRemove(virQEMUDriver *driver,
-                                 virDomainObj *vm)
-{
-    VIR_DEBUG("vm=%s", vm->def->name);
-    return virCloseCallbacksUnset(driver->closeCallbacks, vm,
-                                  qemuProcessAutoDestroy);
-}
-
-bool qemuProcessAutoDestroyActive(virQEMUDriver *driver,
-                                  virDomainObj *vm)
-{
-    virCloseCallback cb;
-    VIR_DEBUG("vm=%s", vm->def->name);
-    cb = virCloseCallbacksGet(driver->closeCallbacks, vm, NULL);
-    return cb == qemuProcessAutoDestroy;
-}
-
 
 int
 qemuProcessRefreshDisks(virDomainObj *vm,
index 9a24745f1579db3714dccb55516ef6b975af8b7e..b171f0464ca47b6c59ea0d1006c28b583d70e66f 100644 (file)
@@ -168,15 +168,8 @@ int qemuProcessKill(virDomainObj *vm, unsigned int flags);
 
 void qemuProcessShutdownOrReboot(virDomainObj *vm);
 
-int qemuProcessAutoDestroyInit(virQEMUDriver *driver);
-void qemuProcessAutoDestroyShutdown(virQEMUDriver *driver);
-int qemuProcessAutoDestroyAdd(virQEMUDriver *driver,
-                              virDomainObj *vm,
-                              virConnectPtr conn);
-int qemuProcessAutoDestroyRemove(virQEMUDriver *driver,
-                                 virDomainObj *vm);
-bool qemuProcessAutoDestroyActive(virQEMUDriver *driver,
-                                  virDomainObj *vm);
+void qemuProcessAutoDestroy(virDomainObj *dom,
+                            virConnectPtr conn);
 
 int qemuProcessSetSchedParams(int id, pid_t pid, size_t nsp,
                               virDomainThreadSchedParam *sp);