[PATCH 10/36] qemu: Use new connection close callbacks API

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
 src/qemu/qemu_conf.c      | 17 +++++++++-----
 src/qemu/qemu_conf.h      |  3 ---
 src/qemu/qemu_driver.c    |  8 +------
 src/qemu/qemu_migration.c | 47 +++++++++++++--------------------------
 src/qemu/qemu_process.c   | 35 ++++-------------------------
 src/qemu/qemu_process.h   | 11 ++-------
 6 files changed, 34 insertions(+), 87 deletions(-)

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index ae5bbcd138..0f10c5bf93 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -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;
 }


diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 8cf2dd2ec5..b7ed00ca41 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -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;
 };
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 1b3da86c81..bd8c907567 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -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;
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index f4441d61ae..61a2bc39c4 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -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);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index b6adcf2f2a..fc4e58f95b 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -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,
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index 9a24745f15..b171f0464c 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -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);
-- 
2.38.1




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux