[libvirt PATCH 56/80] qemu: Separate starting migration from qemuMigrationSrcRun

Jiri Denemark jdenemar at redhat.com
Tue May 10 15:21:17 UTC 2022


qemuMigrationSrcRun does a lot of thing before and after telling QEMU to
start the migration. Let's make the core reusable by moving it to a new
qemuMigrationSrcStart function.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 src/qemu/qemu_migration.c | 118 +++++++++++++++++++++++---------------
 1 file changed, 71 insertions(+), 47 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index dd18a4ad63..e1c67c51ec 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -4413,6 +4413,76 @@ qemuMigrationSrcRunPrepareBlockDirtyBitmaps(virDomainObj *vm,
 }
 
 
+/* The caller is supposed to enter monitor before calling this. */
+static int
+qemuMigrationSrcStart(virQEMUDriver *driver,
+                      virDomainObj *vm,
+                      qemuMigrationSpec *spec,
+                      unsigned int migrateFlags,
+                      int *tunnelFd)
+{
+    qemuDomainObjPrivate *priv = vm->privateData;
+    g_autofree char *timestamp = NULL;
+    int rc;
+
+    /* connect to the destination qemu if needed */
+    if ((spec->destType == MIGRATION_DEST_CONNECT_HOST ||
+         spec->destType == MIGRATION_DEST_CONNECT_SOCKET) &&
+        qemuMigrationSrcConnect(driver, vm, spec) < 0) {
+        return -1;
+    }
+
+    /* log start of migration */
+    if ((timestamp = virTimeStringNow()) != NULL)
+        qemuDomainLogAppendMessage(driver, vm, "%s: initiating migration\n", timestamp);
+
+    switch (spec->destType) {
+    case MIGRATION_DEST_HOST:
+        if (STREQ(spec->dest.host.protocol, "rdma") &&
+            vm->def->mem.hard_limit > 0 &&
+            virProcessSetMaxMemLock(vm->pid, vm->def->mem.hard_limit << 10) < 0) {
+            return -1;
+        }
+        return qemuMonitorMigrateToHost(priv->mon, migrateFlags,
+                                        spec->dest.host.protocol,
+                                        spec->dest.host.name,
+                                        spec->dest.host.port);
+
+    case MIGRATION_DEST_SOCKET:
+        qemuSecurityDomainSetPathLabel(driver, vm, spec->dest.socket.path, false);
+        return qemuMonitorMigrateToSocket(priv->mon, migrateFlags,
+                                          spec->dest.socket.path);
+
+    case MIGRATION_DEST_CONNECT_HOST:
+    case MIGRATION_DEST_CONNECT_SOCKET:
+        /* handled above and transformed into MIGRATION_DEST_FD */
+        break;
+
+    case MIGRATION_DEST_FD:
+        if (spec->fwdType != MIGRATION_FWD_DIRECT) {
+            if (!tunnelFd) {
+                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                               _("tunnelFD argument is required for tunnelled "
+                                 "migration"));
+                VIR_FORCE_CLOSE(spec->dest.fd.local);
+                VIR_FORCE_CLOSE(spec->dest.fd.qemu);
+                return -1;
+            }
+            *tunnelFd = spec->dest.fd.local;
+            spec->dest.fd.local = -1;
+        }
+        rc = qemuMonitorMigrateToFd(priv->mon, migrateFlags,
+                                    spec->dest.fd.qemu);
+        VIR_FORCE_CLOSE(spec->dest.fd.qemu);
+        return rc;
+    }
+
+    virReportError(VIR_ERR_INTERNAL_ERROR,
+                   _("unexpected migration schema: %d"), spec->destType);
+    return -1;
+}
+
+
 static int
 qemuMigrationSrcRun(virQEMUDriver *driver,
                     virDomainObj *vm,
@@ -4448,7 +4518,6 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
     bool cancel = false;
     unsigned int waitFlags;
     g_autoptr(virDomainDef) persistDef = NULL;
-    g_autofree char *timestamp = NULL;
     int rc;
 
     if (resource > 0)
@@ -4624,52 +4693,7 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
         qemuMonitorSetMigrationSpeed(priv->mon, priv->migMaxBandwidth) < 0)
         goto exit_monitor;
 
-    /* connect to the destination qemu if needed */
-    if ((spec->destType == MIGRATION_DEST_CONNECT_HOST ||
-         spec->destType == MIGRATION_DEST_CONNECT_SOCKET) &&
-        qemuMigrationSrcConnect(driver, vm, spec) < 0) {
-        goto exit_monitor;
-    }
-
-    /* log start of migration */
-    if ((timestamp = virTimeStringNow()) != NULL)
-        qemuDomainLogAppendMessage(driver, vm, "%s: initiating migration\n", timestamp);
-
-    rc = -1;
-    switch (spec->destType) {
-    case MIGRATION_DEST_HOST:
-        if (STREQ(spec->dest.host.protocol, "rdma") &&
-            vm->def->mem.hard_limit > 0 &&
-            virProcessSetMaxMemLock(vm->pid, vm->def->mem.hard_limit << 10) < 0) {
-            goto exit_monitor;
-        }
-        rc = qemuMonitorMigrateToHost(priv->mon, migrate_flags,
-                                      spec->dest.host.protocol,
-                                      spec->dest.host.name,
-                                      spec->dest.host.port);
-        break;
-
-    case MIGRATION_DEST_SOCKET:
-        qemuSecurityDomainSetPathLabel(driver, vm, spec->dest.socket.path, false);
-        rc = qemuMonitorMigrateToSocket(priv->mon, migrate_flags,
-                                        spec->dest.socket.path);
-        break;
-
-    case MIGRATION_DEST_CONNECT_HOST:
-    case MIGRATION_DEST_CONNECT_SOCKET:
-        /* handled above and transformed into MIGRATION_DEST_FD */
-        break;
-
-    case MIGRATION_DEST_FD:
-        if (spec->fwdType != MIGRATION_FWD_DIRECT) {
-            fd = spec->dest.fd.local;
-            spec->dest.fd.local = -1;
-        }
-        rc = qemuMonitorMigrateToFd(priv->mon, migrate_flags,
-                                    spec->dest.fd.qemu);
-        VIR_FORCE_CLOSE(spec->dest.fd.qemu);
-        break;
-    }
+    rc = qemuMigrationSrcStart(driver, vm, spec, migrate_flags, &fd);
 
     qemuDomainObjExitMonitor(vm);
     if (rc < 0)
-- 
2.35.1



More information about the libvir-list mailing list