459f93
From 8cccd9634ecd91a5b7343eddc037e0fa7de2f9f6 Mon Sep 17 00:00:00 2001
459f93
Message-Id: <8cccd9634ecd91a5b7343eddc037e0fa7de2f9f6@dist-git>
459f93
From: Jiri Denemark <jdenemar@redhat.com>
459f93
Date: Wed, 22 Jun 2022 16:12:02 +0200
459f93
Subject: [PATCH] qemu_migration: Restore original memory locking limit
459f93
MIME-Version: 1.0
459f93
Content-Type: text/plain; charset=UTF-8
459f93
Content-Transfer-Encoding: 8bit
459f93
459f93
For RDMA migration we update memory locking limit, but never set it back
459f93
once migration finishes (on the destination host) or aborts (on the
459f93
source host).
459f93
459f93
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
459f93
Reviewed-by: Ján Tomko <jtomko@redhat.com>
459f93
(cherry picked from commit d4d3bb813031275c2c7cf72724b83c97ce82ab7a)
459f93
459f93
https://bugzilla.redhat.com/show_bug.cgi?id=2089433
459f93
459f93
Conflicts:
459f93
	src/qemu/qemu_migration.c
459f93
            - post-copy resovery not backported
459f93
459f93
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
459f93
---
459f93
 src/qemu/qemu_domain.c    | 12 ++++++++++++
459f93
 src/qemu/qemu_domain.h    |  3 +++
459f93
 src/qemu/qemu_migration.c | 10 ++++++++--
459f93
 3 files changed, 23 insertions(+), 2 deletions(-)
459f93
459f93
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
459f93
index a81789f194..c24d1e4d53 100644
459f93
--- a/src/qemu/qemu_domain.c
459f93
+++ b/src/qemu/qemu_domain.c
459f93
@@ -2389,6 +2389,11 @@ qemuDomainObjPrivateXMLFormat(virBuffer *buf,
459f93
                           priv->originalMemlock);
459f93
     }
459f93
 
459f93
+    if (priv->preMigrationMemlock > 0) {
459f93
+        virBufferAsprintf(buf, "<preMigrationMemlock>%llu</preMigrationMemlock>\n",
459f93
+                          priv->preMigrationMemlock);
459f93
+    }
459f93
+
459f93
     return 0;
459f93
 }
459f93
 
459f93
@@ -3117,6 +3122,13 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
459f93
         goto error;
459f93
     }
459f93
 
459f93
+    if (virXPathULongLong("string(./preMigrationMemlock)", ctxt,
459f93
+                          &priv->preMigrationMemlock) == -2) {
459f93
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
459f93
+                       _("failed to parse pre-migration memlock limit"));
459f93
+        return -1;
459f93
+    }
459f93
+
459f93
     return 0;
459f93
 
459f93
  error:
459f93
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
459f93
index 6d1d23439a..d6e8a7a0fb 100644
459f93
--- a/src/qemu/qemu_domain.h
459f93
+++ b/src/qemu/qemu_domain.h
459f93
@@ -146,6 +146,9 @@ struct _qemuDomainObjPrivate {
459f93
     int nbdPort; /* Port used for migration with NBD */
459f93
     unsigned short migrationPort;
459f93
     int preMigrationState;
459f93
+    unsigned long long preMigrationMemlock; /* Original RLIMIT_MEMLOCK in case
459f93
+                                               it was changed for the current
459f93
+                                               migration job. */
459f93
 
459f93
     virChrdevs *devs;
459f93
 
459f93
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
459f93
index 10338f8e87..35ad201580 100644
459f93
--- a/src/qemu/qemu_migration.c
459f93
+++ b/src/qemu/qemu_migration.c
459f93
@@ -2974,7 +2974,8 @@ qemuMigrationDstPrepareAny(virQEMUDriver *driver,
459f93
 
459f93
     if (STREQ_NULLABLE(protocol, "rdma") &&
459f93
         vm->def->mem.hard_limit > 0 &&
459f93
-        qemuDomainSetMaxMemLock(vm, vm->def->mem.hard_limit << 10, NULL) < 0) {
459f93
+        qemuDomainSetMaxMemLock(vm, vm->def->mem.hard_limit << 10,
459f93
+                                &priv->preMigrationMemlock) < 0) {
459f93
         goto stopjob;
459f93
     }
459f93
 
459f93
@@ -3451,6 +3452,7 @@ qemuMigrationSrcConfirmPhase(virQEMUDriver *driver,
459f93
                                          VIR_DOMAIN_EVENT_STOPPED_MIGRATED);
459f93
         virObjectEventStateQueue(driver->domainEventState, event);
459f93
         qemuDomainEventEmitJobCompleted(driver, vm);
459f93
+        priv->preMigrationMemlock = 0;
459f93
     } else {
459f93
         virErrorPtr orig_err;
459f93
         int reason;
459f93
@@ -3471,6 +3473,7 @@ qemuMigrationSrcConfirmPhase(virQEMUDriver *driver,
459f93
 
459f93
         qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
459f93
                                  jobPriv->migParams, priv->job.apiFlags);
459f93
+        qemuDomainSetMaxMemLock(vm, 0, &priv->preMigrationMemlock);
459f93
 
459f93
         qemuDomainSaveStatus(vm);
459f93
     }
459f93
@@ -4224,7 +4227,8 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
459f93
     case MIGRATION_DEST_HOST:
459f93
         if (STREQ(spec->dest.host.protocol, "rdma") &&
459f93
             vm->def->mem.hard_limit > 0 &&
459f93
-            qemuDomainSetMaxMemLock(vm, vm->def->mem.hard_limit << 10, NULL) < 0) {
459f93
+            qemuDomainSetMaxMemLock(vm, vm->def->mem.hard_limit << 10,
459f93
+                                    &priv->preMigrationMemlock) < 0) {
459f93
             goto exit_monitor;
459f93
         }
459f93
         rc = qemuMonitorMigrateToHost(priv->mon, migrate_flags,
459f93
@@ -5408,6 +5412,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriver *driver,
459f93
     if (ret < 0) {
459f93
         qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
459f93
                                  jobPriv->migParams, priv->job.apiFlags);
459f93
+        qemuDomainSetMaxMemLock(vm, 0, &priv->preMigrationMemlock);
459f93
         qemuMigrationJobFinish(driver, vm);
459f93
     } else {
459f93
         qemuMigrationJobContinue(vm);
459f93
@@ -5881,6 +5886,7 @@ qemuMigrationDstFinish(virQEMUDriver *driver,
459f93
  cleanup:
459f93
     g_clear_pointer(&jobInfo, qemuDomainJobInfoFree);
459f93
     virPortAllocatorRelease(port);
459f93
+    qemuDomainSetMaxMemLock(vm, 0, &priv->preMigrationMemlock);
459f93
     if (priv->mon)
459f93
         qemuMonitorSetDomainLog(priv->mon, NULL, NULL, NULL);
459f93
     VIR_FREE(priv->origname);
459f93
-- 
459f93
2.35.1
459f93