]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Restore original memory locking limit on reconnect
authorJiri Denemark <jdenemar@redhat.com>
Wed, 27 Jul 2022 12:33:23 +0000 (14:33 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 28 Jul 2022 11:04:45 +0000 (13:04 +0200)
Commit v8.4.0-287-gd4d3bb8130 tried to make sure the original
pre-migration memory locking limit is restored at the end of migration,
but it missed the case when libvirt daemon is restarted during
migration which needs to be aborted on reconnect.

And if this was not enough, I forgot to actually save the status XML
after setting the field in priv (in the commit mentioned above and also
in v8.4.0-291-gd375993ab3).

https://bugzilla.redhat.com/show_bug.cgi?id=2107424

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_migration.c
src/qemu/qemu_process.c

index 8e9428a5bbb61d1517d19efd3d5057695581c561..e1f5e49683f5ab3868f86ff27583b36bca816c9f 100644 (file)
@@ -4672,10 +4672,12 @@ qemuMigrationSrcStart(virDomainObj *vm,
     switch (spec->destType) {
     case MIGRATION_DEST_HOST:
         if (STREQ(spec->dest.host.protocol, "rdma") &&
-            virMemoryLimitIsSet(vm->def->mem.hard_limit) &&
-            qemuDomainSetMaxMemLock(vm, vm->def->mem.hard_limit << 10,
-                                    &priv->preMigrationMemlock) < 0) {
-            return -1;
+            virMemoryLimitIsSet(vm->def->mem.hard_limit)) {
+            if (qemuDomainSetMaxMemLock(vm, vm->def->mem.hard_limit << 10,
+                                        &priv->preMigrationMemlock) < 0)
+                return -1;
+            /* Store the original memory locking limit */
+            qemuDomainSaveStatus(vm);
         }
         return qemuMonitorMigrateToHost(priv->mon, migrateFlags,
                                         spec->dest.host.protocol,
@@ -4868,6 +4870,9 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
 
         if (qemuDomainSetMaxMemLock(vm, limit << 10, &priv->preMigrationMemlock) < 0)
             goto error;
+
+        /* Store the original memory locking limit */
+        qemuDomainSaveStatus(vm);
     }
 
     if (storageMigration) {
index d42333195a14ffcc85b3192b5f0c23ed82d4bc0a..137dcf5cf45c99b9cc1bc16d84aa4fb22879fc60 100644 (file)
@@ -3678,6 +3678,7 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
 {
     virDomainJobStatus migStatus = VIR_DOMAIN_JOB_STATUS_NONE;
     qemuDomainJobPrivate *jobPriv = job->privateData;
+    qemuDomainObjPrivate *priv = vm->privateData;
     virDomainState state;
     int reason;
     int rc;
@@ -3727,6 +3728,7 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
 
     qemuMigrationParamsReset(driver, vm, VIR_ASYNC_JOB_NONE,
                              jobPriv->migParams, job->apiFlags);
+    qemuDomainSetMaxMemLock(vm, 0, &priv->preMigrationMemlock);
 
     return 0;
 }