[libvirt RFCv9 29/31] qemu: saveimage: implement multifd-compression in parallel save

Claudio Fontana cfontana at suse.de
Sat May 14 15:53:11 UTC 2022


Signed-off-by: Claudio Fontana <cfontana at suse.de>
---
 src/qemu/qemu_migration.c | 17 +++++++++++++----
 src/qemu/qemu_migration.h |  2 +-
 src/qemu/qemu_saveimage.c | 19 ++++++++++++++-----
 3 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index c4e1837419..f16b4976bc 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -5884,7 +5884,7 @@ qemuMigrationSrcToFileAux(virQEMUDriver *driver, virDomainObj *vm,
                           virCommand *compressor,
                           virDomainAsyncJob asyncJob,
                           const char *sun_path,
-                          int nchannels)
+                          int nchannels, const char *pcomp)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
     bool bwParam = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_PARAM_BANDWIDTH);
@@ -5931,6 +5931,15 @@ qemuMigrationSrcToFileAux(virQEMUDriver *driver, virDomainObj *vm,
                                       QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS,
                                       nchannels) < 0)
             return -1;
+        if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_PARAM_MULTIFD_COMPRESSION)) {
+            if (qemuMigrationParamsSetString(migParams,
+                                             QEMU_MIGRATION_PARAM_MULTIFD_COMPRESSION, pcomp) < 0)
+                return -1;
+        } else {
+            virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+                           _("QEMU does not seem to support multifd compression"));
+            return -1;
+        }
     }
 
     if (needParams && qemuMigrationParamsApply(driver, vm, asyncJob, migParams) < 0)
@@ -6056,17 +6065,17 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm,
                        virDomainAsyncJob asyncJob)
 {
     return qemuMigrationSrcToFileAux(driver, vm, fd, compressor,
-                                     asyncJob, NULL, -1);
+                                     asyncJob, NULL, -1, NULL);
 }
 
 int
 qemuMigrationSrcToFilesMultiFd(virQEMUDriver *driver, virDomainObj *vm,
                                virDomainAsyncJob asyncJob,
                                const char *sun_path,
-                               int nchannels)
+                               int nchannels, const char *pcomp)
 {
     return qemuMigrationSrcToFileAux(driver, vm, -1, NULL,
-                                     asyncJob, sun_path, nchannels);
+                                     asyncJob, sun_path, nchannels, pcomp);
 }
 
 int
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index 38f4877cf0..d6185770b2 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -223,7 +223,7 @@ int
 qemuMigrationSrcToFilesMultiFd(virQEMUDriver *driver, virDomainObj *vm,
                                virDomainAsyncJob asyncJob,
                                const char *sun_path,
-                               int nchannels)
+                               int nchannels, const char *pcomp)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT;
 
 int
diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c
index 784bd7e647..2598927eeb 100644
--- a/src/qemu/qemu_saveimage.c
+++ b/src/qemu/qemu_saveimage.c
@@ -598,13 +598,14 @@ qemuSaveImageCreate(virQEMUDriver *driver,
                     virQEMUSaveData *data,
                     virCommand *compressor,
                     int nconn,
-                    const char *pcomp G_GNUC_UNUSED,
+                    const char *pcomp,
                     unsigned int flags,
                     virDomainAsyncJob asyncJob)
 {
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
     virQEMUSaveFd saveFd = QEMU_SAVEFD_INVALID;
     virQEMUSaveFd *multiFd = NULL;
+    virQEMUSaveMultiFdComp multiComp = QEMU_SAVE_MULTIFD_COMP_NONE;
     unsigned int oflags = O_WRONLY | O_TRUNC | O_CREAT;
     int ret = -1;
 
@@ -616,15 +617,23 @@ qemuSaveImageCreate(virQEMUDriver *driver,
         }
         oflags |= O_DIRECT;
     }
-
+    if (!pcomp || !pcomp[0]) {
+        pcomp = qemuSaveMultiFdCompTypeToString(QEMU_SAVE_MULTIFD_COMP_NONE);
+    }
     if (virQEMUSaveFdInit(&saveFd, path, 0, oflags, cfg, flags & VIR_DOMAIN_SAVE_PARALLEL) < 0)
         goto cleanup;
     if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, saveFd.fd) < 0)
         goto cleanup;
 
-    if (nconn > 0)
+    if (nconn > 0) {
         data->header.multifd_channels = nconn;
-
+        if ((multiComp = qemuSaveMultiFdCompTypeFromString(pcomp)) < 0) {
+            virReportError(VIR_ERR_OPERATION_FAILED,
+                           _("Invalid %s multifd compression format specified"), pcomp);
+            goto cleanup;
+        }
+        data->header.multifd_comp = multiComp;
+    }
     if (virQEMUSaveDataWrite(data, saveFd.fd, saveFd.path) < 0)
         goto cleanup;
 
@@ -654,7 +663,7 @@ qemuSaveImageCreate(virQEMUDriver *driver,
             goto cleanup;
         if (chown(sun_path, cfg->user, cfg->group) < 0)
             goto cleanup;
-        if (qemuMigrationSrcToFilesMultiFd(driver, vm, asyncJob, sun_path, nconn) < 0)
+        if (qemuMigrationSrcToFilesMultiFd(driver, vm, asyncJob, sun_path, nconn, pcomp) < 0)
             goto cleanup;
         if (qemuSaveImageCloseMultiFd(multiFd, nconn, vm) < 0)
             goto cleanup;
-- 
2.35.3



More information about the libvir-list mailing list