[PATCH 2/3] qemu: migration: implement zstd compression

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



QEMU now supports multifd-compression=zstd for migration with enabled multifd.
Bring the support to libvirt as well.

Signed-off-by: Oleg Vasilev <oleg.vasilev@xxxxxxxxxxxxx>
---
 include/libvirt/libvirt-domain.h | 10 ++++++++++
 src/qemu/qemu_migration.h        |  1 +
 src/qemu/qemu_migration_params.c | 32 ++++++++++++++++++++++++++++++++
 src/qemu/qemu_migration_params.h |  2 ++
 tools/virsh-completer-domain.c   |  2 +-
 tools/virsh-domain.c             | 14 ++++++++++++++
 6 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 3ebb2c6642..f267ca357b 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -1319,6 +1319,16 @@ typedef enum {
  */
 # define VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE "compression.xbzrle.cache"
 
+/**
+ * VIR_MIGRATE_PARAM_COMPRESSION_ZSTD_LEVEL:
+ *
+ * virDomainMigrate* params field: the level of compression for zstd
+ * compression as VIR_TYPED_PARAM_INT. Accepted values are in range 1-22.
+ *
+ * Since: 9.0.0
+ */
+# define VIR_MIGRATE_PARAM_COMPRESSION_ZSTD_LEVEL "compression.zstd.level"
+
 /**
  * VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL:
  *
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index d21b6f67e8..09d21fd878 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -88,6 +88,7 @@
     VIR_MIGRATE_PARAM_PARALLEL_CONNECTIONS, VIR_TYPED_PARAM_INT, \
     VIR_MIGRATE_PARAM_TLS_DESTINATION, VIR_TYPED_PARAM_STRING, \
     VIR_MIGRATE_PARAM_DISKS_URI,     VIR_TYPED_PARAM_STRING, \
+    VIR_MIGRATE_PARAM_COMPRESSION_ZSTD_LEVEL, VIR_TYPED_PARAM_INT, \
     NULL
 
 
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index a40f791be6..2533353ccf 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -71,6 +71,7 @@ struct _qemuMigrationParams {
 typedef enum {
     QEMU_MIGRATION_COMPRESS_XBZRLE = 0,
     QEMU_MIGRATION_COMPRESS_MT,
+    QEMU_MIGRATION_COMPRESS_ZSTD,
 
     QEMU_MIGRATION_COMPRESS_LAST
 } qemuMigrationCompressMethod;
@@ -79,6 +80,7 @@ VIR_ENUM_IMPL(qemuMigrationCompressMethod,
               QEMU_MIGRATION_COMPRESS_LAST,
               "xbzrle",
               "mt",
+              "zstd",
 );
 
 VIR_ENUM_IMPL(qemuMigrationCapability,
@@ -114,6 +116,8 @@ VIR_ENUM_IMPL(qemuMigrationParam,
               "xbzrle-cache-size",
               "max-postcopy-bandwidth",
               "multifd-channels",
+              "multifd-compression",
+              "multifd-zstd-level",
 );
 
 typedef struct _qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOnItem;
@@ -216,6 +220,10 @@ static const qemuMigrationParamsTPMapItem qemuMigrationParamsTPMap[] = {
      .param = QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE,
      .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
 
+    {.typedParam = VIR_MIGRATE_PARAM_COMPRESSION_ZSTD_LEVEL,
+     .param = QEMU_MIGRATION_PARAM_MULTIFD_ZSTD_LEVEL,
+     .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
+
     {.typedParam = VIR_MIGRATE_PARAM_BANDWIDTH_POSTCOPY,
      .unit = 1024 * 1024, /* MiB/s */
      .param = QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH,
@@ -271,6 +279,12 @@ static const qemuMigrationParamInfoItem qemuMigrationParamInfo[] = {
     [QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS] = {
         .type = QEMU_MIGRATION_PARAM_TYPE_INT,
     },
+    [QEMU_MIGRATION_PARAM_MULTIFD_COMPRESSION] = {
+        .type = QEMU_MIGRATION_PARAM_TYPE_STRING,
+    },
+    [QEMU_MIGRATION_PARAM_MULTIFD_ZSTD_LEVEL] = {
+        .type = QEMU_MIGRATION_PARAM_TYPE_INT,
+    },
 };
 G_STATIC_ASSERT(G_N_ELEMENTS(qemuMigrationParamInfo) == QEMU_MIGRATION_PARAM_LAST);
 
@@ -546,6 +560,10 @@ qemuMigrationParamsSetCompression(virTypedParameterPtr params,
             cap = QEMU_MIGRATION_CAP_COMPRESS;
             break;
 
+        case QEMU_MIGRATION_COMPRESS_ZSTD:
+            qemuMigrationParamsSetString(migParams,
+                                         QEMU_MIGRATION_PARAM_MULTIFD_COMPRESSION,
+                                         "zstd");
         case QEMU_MIGRATION_COMPRESS_LAST:
         default:
             continue;
@@ -569,6 +587,13 @@ qemuMigrationParamsSetCompression(virTypedParameterPtr params,
         return -1;
     }
 
+    if (migParams->params[QEMU_MIGRATION_PARAM_MULTIFD_ZSTD_LEVEL].set &&
+        !(migParams->compMethods & (1ULL << QEMU_MIGRATION_COMPRESS_ZSTD))) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("Turn zstd compression on to tune it"));
+        return -1;
+    }
+
     if (!migParams->compMethods && (flags & VIR_MIGRATE_COMPRESSED)) {
         migParams->compMethods = 1ULL << QEMU_MIGRATION_COMPRESS_XBZRLE;
         ignore_value(virBitmapSetBit(migParams->caps,
@@ -669,6 +694,13 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params,
         return NULL;
     }
 
+    if (migParams->params[QEMU_MIGRATION_PARAM_MULTIFD_ZSTD_LEVEL].set &&
+        !(flags & VIR_MIGRATE_PARALLEL)) {
+            virReportError(VIR_ERR_INVALID_ARG, "%s",
+                        _("Turn parallel migration on to tune zstd level"));
+        return NULL;
+    }
+
     if (qemuMigrationParamsSetCompression(params, nparams, flags, migParams) < 0)
         return NULL;
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 458a7a4dfa..383b25ce63 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -59,6 +59,8 @@ typedef enum {
     QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE,
     QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH,
     QEMU_MIGRATION_PARAM_MULTIFD_CHANNELS,
+    QEMU_MIGRATION_PARAM_MULTIFD_COMPRESSION,
+    QEMU_MIGRATION_PARAM_MULTIFD_ZSTD_LEVEL,
 
     QEMU_MIGRATION_PARAM_LAST
 } qemuMigrationParam;
diff --git a/tools/virsh-completer-domain.c b/tools/virsh-completer-domain.c
index b54baf3577..66748b7b65 100644
--- a/tools/virsh-completer-domain.c
+++ b/tools/virsh-completer-domain.c
@@ -1012,7 +1012,7 @@ virshDomainMigrateCompMethodsCompleter(vshControl *ctl,
                                        const vshCmd *cmd,
                                        unsigned int flags)
 {
-    const char *methods[] = {"xbzrle", "mt",  NULL};
+    const char *methods[] = {"xbzrle", "mt", "zstd", NULL};
     const char *method = NULL;
 
     virCheckFlags(0, NULL);
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 6850843a25..0813bd5de0 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -11056,6 +11056,10 @@ static const vshCmdOptDef opts_migrate[] = {
      .type = VSH_OT_INT,
      .help = N_("page cache size for xbzrle compression")
     },
+    {.name = "comp-zstd-level",
+     .type = VSH_OT_INT,
+     .help = N_("zstd level for zstd compression")
+    },
     {.name = "auto-converge-initial",
      .type = VSH_OT_INT,
      .help = N_("initial CPU throttling rate for auto-convergence")
@@ -11238,6 +11242,16 @@ doMigrate(void *opaque)
             goto save_error;
     }
 
+    if ((rv = vshCommandOptInt(ctl, cmd, "comp-zstd-level", &intOpt)) < 0) {
+        goto out;
+    } else if (rv > 0) {
+        if (virTypedParamsAddInt(&params, &nparams, &maxparams,
+                                  VIR_MIGRATE_PARAM_COMPRESSION_ZSTD_LEVEL,
+                                  intOpt) < 0)
+            goto save_error;
+    }
+
+
     if (vshCommandOptStringReq(ctl, cmd, "xml", &opt) < 0)
         goto out;
     if (opt) {
-- 
2.40.0




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux