[libvirt PATCH v2 67/81] qemu: Implement VIR_MIGRATE_POSTCOPY_RESUME for Finish phase

Jiri Denemark posted 81 patches 3 years, 8 months ago
[libvirt PATCH v2 67/81] qemu: Implement VIR_MIGRATE_POSTCOPY_RESUME for Finish phase
Posted by Jiri Denemark 3 years, 8 months ago
Everything was already done in the normal Finish phase and vCPUs are
running. We just need to wait for all remaining data to be transferred.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
---

Notes:
    Version 2:
    - no change

 src/qemu/qemu_migration.c | 46 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 40 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index dbebd215b4..a078cbcd41 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -6556,6 +6556,22 @@ qemuMigrationDstFinishFresh(virQEMUDriver *driver,
 }
 
 
+static int
+qemuMigrationDstFinishResume(virQEMUDriver *driver,
+                             virDomainObj *vm)
+{
+    VIR_DEBUG("vm=%p", vm);
+
+    if (qemuMigrationDstWaitForCompletion(driver, vm,
+                                          VIR_ASYNC_JOB_MIGRATION_IN,
+                                          false) < 0) {
+        return -1;
+    }
+
+    return 0;
+}
+
+
 static virDomainPtr
 qemuMigrationDstFinishActive(virQEMUDriver *driver,
                              virConnectPtr dconn,
@@ -6603,8 +6619,14 @@ qemuMigrationDstFinishActive(virQEMUDriver *driver,
         goto error;
     }
 
-    rc = qemuMigrationDstFinishFresh(driver, vm, mig, flags, v3proto,
-                                     timeReceived, &doKill, &inPostCopy);
+    if (flags & VIR_MIGRATE_POSTCOPY_RESUME) {
+        rc = qemuMigrationDstFinishResume(driver, vm);
+        inPostCopy = true;
+    } else {
+        rc = qemuMigrationDstFinishFresh(driver, vm, mig, flags, v3proto,
+                                         timeReceived, &doKill, &inPostCopy);
+    }
+
     if (rc < 0 ||
         !(dom = virGetDomain(dconn, vm->def->name, vm->def->uuid, vm->def->id)))
         goto error;
@@ -6675,6 +6697,8 @@ qemuMigrationDstFinish(virQEMUDriver *driver,
     qemuDomainObjPrivate *priv = vm->privateData;
     unsigned short port;
     unsigned long long timeReceived = 0;
+    int phase = v3proto ? QEMU_MIGRATION_PHASE_FINISH3
+                        : QEMU_MIGRATION_PHASE_FINISH2;
 
     VIR_DEBUG("driver=%p, dconn=%p, vm=%p, cookiein=%s, cookieinlen=%d, "
               "cookieout=%p, cookieoutlen=%p, flags=0x%lx, retcode=%d",
@@ -6689,14 +6713,24 @@ qemuMigrationDstFinish(virQEMUDriver *driver,
         goto cleanup;
     }
 
+    if (flags & VIR_MIGRATE_POSTCOPY_RESUME) {
+        if (!qemuMigrationAnyCanResume(vm, VIR_ASYNC_JOB_MIGRATION_IN, flags,
+                                       QEMU_MIGRATION_PHASE_PREPARE_RESUME))
+            goto cleanup;
+        phase = QEMU_MIGRATION_PHASE_FINISH_RESUME;
+    }
     ignore_value(virTimeMillisNow(&timeReceived));
 
-    if (qemuMigrationJobStartPhase(vm,
-                                   v3proto ? QEMU_MIGRATION_PHASE_FINISH3
-                                           : QEMU_MIGRATION_PHASE_FINISH2) < 0)
+    if (qemuMigrationJobStartPhase(vm, phase) < 0)
         goto cleanup;
 
-    qemuDomainCleanupRemove(vm, qemuMigrationDstPrepareCleanup);
+    if (flags & VIR_MIGRATE_POSTCOPY_RESUME) {
+        virCloseCallbacksUnset(driver->closeCallbacks, vm,
+                               qemuMigrationAnyConnectionClosed);
+        qemuDomainCleanupRemove(vm, qemuProcessCleanupMigrationJob);
+    } else {
+        qemuDomainCleanupRemove(vm, qemuMigrationDstPrepareCleanup);
+    }
     g_clear_pointer(&priv->job.completed, virDomainJobDataFree);
 
     cookie_flags = QEMU_MIGRATION_COOKIE_NETWORK |
-- 
2.35.1
Re: [libvirt PATCH v2 67/81] qemu: Implement VIR_MIGRATE_POSTCOPY_RESUME for Finish phase
Posted by Jiri Denemark 3 years, 8 months ago
On Wed, Jun 01, 2022 at 14:50:07 +0200, Jiri Denemark wrote:
> Everything was already done in the normal Finish phase and vCPUs are
> running. We just need to wait for all remaining data to be transferred.
> 
> Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
> Reviewed-by: Peter Krempa <pkrempa@redhat.com>
> Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
> ---
> 
> Notes:
>     Version 2:
>     - no change
> 
>  src/qemu/qemu_migration.c | 46 ++++++++++++++++++++++++++++++++++-----
>  1 file changed, 40 insertions(+), 6 deletions(-)

Consider the following diff squashed in, otherwise the domain will be
killed on destination in case a resume attempt fails early.

Jirka

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 644c123702..0d60961f86 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -6599,7 +6599,7 @@ qemuMigrationDstFinishActive(virQEMUDriver *driver,
     qemuDomainJobPrivate *jobPriv = priv->job.privateData;
     virObjectEvent *event;
     bool inPostCopy = false;
-    bool doKill = true;
+    bool doKill = priv->job.phase != QEMU_MIGRATION_PHASE_FINISH_RESUME;
     int rc;

     VIR_DEBUG("vm=%p, flags=0x%lx, retcode=%d",
Re: [libvirt PATCH v2 67/81] qemu: Implement VIR_MIGRATE_POSTCOPY_RESUME for Finish phase
Posted by Peter Krempa 3 years, 8 months ago
On Fri, Jun 03, 2022 at 14:29:58 +0200, Jiri Denemark wrote:
> On Wed, Jun 01, 2022 at 14:50:07 +0200, Jiri Denemark wrote:
> > Everything was already done in the normal Finish phase and vCPUs are
> > running. We just need to wait for all remaining data to be transferred.
> > 
> > Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
> > Reviewed-by: Peter Krempa <pkrempa@redhat.com>
> > Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
> > ---
> > 
> > Notes:
> >     Version 2:
> >     - no change
> > 
> >  src/qemu/qemu_migration.c | 46 ++++++++++++++++++++++++++++++++++-----
> >  1 file changed, 40 insertions(+), 6 deletions(-)
> 
> Consider the following diff squashed in, otherwise the domain will be
> killed on destination in case a resume attempt fails early.
> 
> Jirka
> 
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 644c123702..0d60961f86 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -6599,7 +6599,7 @@ qemuMigrationDstFinishActive(virQEMUDriver *driver,
>      qemuDomainJobPrivate *jobPriv = priv->job.privateData;
>      virObjectEvent *event;
>      bool inPostCopy = false;
> -    bool doKill = true;
> +    bool doKill = priv->job.phase != QEMU_MIGRATION_PHASE_FINISH_RESUME;
>      int rc;
> 
>      VIR_DEBUG("vm=%p, flags=0x%lx, retcode=%d",
> 

Reviewed-by: Peter Krempa <pkrempa@redhat.com>