[libvirt] [PATCH v3 6/7] qemu migration: add xbzrle compression options

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Thu Jan 28 07:04:32 UTC 2016


Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
---
 include/libvirt/libvirt-domain.h |  8 ++++++++
 src/qemu/qemu_domain.c           |  1 +
 src/qemu/qemu_domain.h           |  1 +
 src/qemu/qemu_driver.c           | 16 ++++++++++++++++
 src/qemu/qemu_migration.c        |  8 ++++++++
 src/qemu/qemu_migration.h        |  2 ++
 6 files changed, 36 insertions(+)

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 36f6e09..c7388c0 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -791,6 +791,14 @@ typedef enum {
  */
 # define VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS "compression.mt.dthreads"
 
+/**
+ * VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE:
+ *
+ * virDomainMigrate* params field: the size of page cache for xbzrle
+ * compression as VIR_TYPED_PARAM_ULLONG.
+ */
+# define VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE "compression.xbzrle.cache"
+
 /* Domain migration. */
 virDomainPtr virDomainMigrate (virDomainPtr domain, virConnectPtr dconn,
                                unsigned long flags, const char *dname,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 03ddee2..2a32c94 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -494,6 +494,7 @@ qemuDomainObjPrivateAlloc(void)
     priv->migrationMT.level = 1;
     priv->migrationMT.threads = 8;
     priv->migrationMT.dthreads = 2;
+    priv->xbzrleCache = 64 * (1 << 20);
 
     return priv;
 
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 48554cd..98165a2 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -183,6 +183,7 @@ struct _qemuDomainObjPrivate {
     unsigned short migrationPort;
     int preMigrationState;
     qemuMonitorMigrationMTParameters migrationMT;
+    unsigned long long xbzrleCache;
 
     virChrdevsPtr devs;
 
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index eb3fd80..6938e13 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12473,6 +12473,20 @@ qemuGetCompression(virTypedParameterPtr params, int nparams,
         return -1;
     }
 
+    if (virTypedParamsGet(params, nparams,
+                          VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE) != NULL &&
+        !(compression->method & QEMU_MIGRATION_COMPESS_XBZRLE)) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("You cannot specify xbzrle compression "
+                          "parameters without turning it on."));
+        return -1;
+    }
+
+    if (virTypedParamsGetULLong(params, nparams,
+                                VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE,
+                                &compression->xbzrle_cache) < 0)
+        return -1;
+
     return 0;
 }
 
@@ -13491,6 +13505,8 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
     } else if (ret > 0) {
         VIR_DEBUG("Setting compression cache to %llu B", cacheSize);
         ret = qemuMonitorSetMigrationCacheSize(priv->mon, cacheSize);
+        if (ret == 0)
+            priv->xbzrleCache = cacheSize;
     }
 
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 81ff6b3..efba84d 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -3340,6 +3340,10 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
                                             compression->mt.dthreads :
                                             priv->migrationMT.dthreads;
 
+    merged.xbzrle_cache = compression->xbzrle_cache != 0 ?
+                                            compression->xbzrle_cache :
+                                            priv->xbzrleCache;
+
     if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
         return -1;
 
@@ -3347,6 +3351,10 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
         qemuMonitorSetMigrationCompressParametersMT(priv->mon, &merged.mt) < 0)
         goto cleanup;
 
+    if ((compression->method & QEMU_MIGRATION_COMPESS_XBZRLE) &&
+        qemuMonitorSetMigrationCacheSize(priv->mon, merged.xbzrle_cache) < 0)
+        goto cleanup;
+
     ret = 0;
 
  cleanup:
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index 63c6a1a..70a37db 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -61,6 +61,7 @@ typedef qemuMigrationCompression *qemuMigrationCompressionPtr;
     VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL,         VIR_TYPED_PARAM_INT,   \
     VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS,       VIR_TYPED_PARAM_UINT,   \
     VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS,      VIR_TYPED_PARAM_UINT,   \
+    VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE,     VIR_TYPED_PARAM_ULLONG, \
     NULL
 
 
@@ -88,6 +89,7 @@ typedef enum {
 struct _qemuMigrationCompression {
     qemuMigrationCompressMethod method;
     qemuMonitorMigrationMTParameters mt;
+    unsigned long long xbzrle_cache;
 };
 
 void qemuMigrationCompressionInit(qemuMigrationCompressionPtr compression);
-- 
1.8.3.1




More information about the libvir-list mailing list