[libvirt] [PATCH v6 1/5] migration: qemu: add option to select compression methods

Jiri Denemark jdenemar at redhat.com
Thu Apr 14 12:40:02 UTC 2016


On Thu, Apr 14, 2016 at 13:33:48 +0300, Nikolay Shirokovskiy wrote:
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---
>  include/libvirt/libvirt-domain.h |   9 ++
>  src/qemu/qemu_driver.c           |  60 +++++++++++---
>  src/qemu/qemu_migration.c        | 173 +++++++++++++++++++++++++++++++++------
>  src/qemu/qemu_migration.h        |  27 ++++++
>  src/qemu/qemu_monitor.c          |   2 +-
>  src/qemu/qemu_monitor.h          |   1 +
>  6 files changed, 234 insertions(+), 38 deletions(-)
...
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index eaabe58..44e8aa0 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
...
> @@ -12551,22 +12573,32 @@ qemuDomainMigratePerform3(virDomainPtr dom,
>  {
>      virQEMUDriverPtr driver = dom->conn->privateData;
>      virDomainObjPtr vm;
> +    qemuMigrationCompressionPtr compression = NULL;
> +    int ret = -1;
>  
>      virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
>  
>      if (!(vm = qemuDomObjFromDomain(dom)))
>          return -1;

s/return -1/goto cleanup/

>  
> +    if (!(compression = qemuMigrationCompressionParse(NULL, 0, flags)))
> +        return -1;
> +

And move this if statement before qemuDomObjFromDomain(), otherwise
you'd need to call virDomainObjEndAPI() here in case of error, which
would be rather ugly.

>      if (virDomainMigratePerform3EnsureACL(dom->conn, vm->def) < 0) {
>          virDomainObjEndAPI(&vm);
> -        return -1;
> +        goto cleanup;
>      }
>  
> -    return qemuMigrationPerform(driver, dom->conn, vm, xmlin,
> -                                dconnuri, uri, NULL, NULL, 0, NULL, 0,
> -                                cookiein, cookieinlen,
> -                                cookieout, cookieoutlen,
> -                                flags, dname, resource, true);
> +    ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin,
> +                               dconnuri, uri, NULL, NULL, 0, NULL, 0,
> +                               compression,
> +                               cookiein, cookieinlen,
> +                               cookieout, cookieoutlen,
> +                               flags, dname, resource, true);
> +
> + cleanup:
> +    VIR_FREE(compression);
> +    return ret;
>  }
>  
>  static int
...
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index e72c874..8fe0f0d 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
...
> @@ -6558,3 +6611,71 @@ qemuMigrationErrorReport(virQEMUDriverPtr driver,
>      virSetError(err);
>      virFreeError(err);
>  }
> +
> +/* don't ever pass NULL params with non zero nparams */
> +qemuMigrationCompressionPtr
> +qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
> +                              unsigned long flags)
> +{
> +    size_t i;
> +    qemuMigrationCompressionPtr compression = NULL;
> +
> +    if (VIR_ALLOC(compression) < 0)
> +        return NULL;
> +
> +    for (i = 0; i < nparams; i++) {
> +        int method;
> +
> +        if (STRNEQ(params[i].field, VIR_MIGRATE_PARAM_COMPRESSION))
> +            continue;
> +
> +        if ((method = qemuMigrationCompressMethodTypeFromString(params[i].value.s)) < 0) {

This line is too long.

ACK with the following squashed in:

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index cc8f7de..d813280 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -791,8 +791,9 @@ typedef enum {
  * VIR_MIGRATE_PARAM_COMPRESSION:
  *
  * virDomainMigrate* params multiple field: name of the method used to
- * compress migration traffic. The parameter may be specified multiple times
- * if more than one method should be used.
+ * compress migration traffic. Supported compression methods: xbzrle, mt.
+ * The parameter may be specified multiple times if more than one method
+ * should be used.
  */
 # define VIR_MIGRATE_PARAM_COMPRESSION    "compression"
 
diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c
index 44e8aa0..e795062 100644
--- i/src/qemu/qemu_driver.c
+++ w/src/qemu/qemu_driver.c
@@ -12578,12 +12578,12 @@ qemuDomainMigratePerform3(virDomainPtr dom,
 
     virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
 
-    if (!(vm = qemuDomObjFromDomain(dom)))
-        return -1;
-
     if (!(compression = qemuMigrationCompressionParse(NULL, 0, flags)))
         return -1;
 
+    if (!(vm = qemuDomObjFromDomain(dom)))
+        goto cleanup;
+
     if (virDomainMigratePerform3EnsureACL(dom->conn, vm->def) < 0) {
         virDomainObjEndAPI(&vm);
         goto cleanup;
diff --git i/src/qemu/qemu_migration.c w/src/qemu/qemu_migration.c
index 35b5748..f30fbfb 100644
--- i/src/qemu/qemu_migration.c
+++ w/src/qemu/qemu_migration.c
@@ -3434,7 +3434,7 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
     if (qemuMigrationSetOption(driver, vm,
                                QEMU_MONITOR_MIGRATION_CAPS_COMPRESS,
                                compression->methods &
-                                   (1ULL << QEMU_MIGRATION_COMPRESS_MULTITHREAD),
+                                   (1ULL << QEMU_MIGRATION_COMPRESS_MT),
                                job) < 0)
         return -1;
 
@@ -6612,9 +6612,11 @@ qemuMigrationErrorReport(virQEMUDriverPtr driver,
     virFreeError(err);
 }
 
+
 /* don't ever pass NULL params with non zero nparams */
 qemuMigrationCompressionPtr
-qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
+qemuMigrationCompressionParse(virTypedParameterPtr params,
+                              int nparams,
                               unsigned long flags)
 {
     size_t i;
@@ -6629,7 +6631,8 @@ qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
         if (STRNEQ(params[i].field, VIR_MIGRATE_PARAM_COMPRESSION))
             continue;
 
-        if ((method = qemuMigrationCompressMethodTypeFromString(params[i].value.s)) < 0) {
+        method = qemuMigrationCompressMethodTypeFromString(params[i].value.s);
+        if (method < 0) {
             virReportError(VIR_ERR_INVALID_ARG,
                            _("Unsupported compression method '%s'"),
                            params[i].value.s);
@@ -6659,7 +6662,8 @@ qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
 int
 qemuMigrationCompressionDump(qemuMigrationCompressionPtr compression,
                              virTypedParameterPtr *params,
-                             int *nparams, int *maxparams,
+                             int *nparams,
+                             int *maxparams,
                              unsigned long *flags)
 {
     size_t i;
@@ -6669,7 +6673,7 @@ qemuMigrationCompressionDump(qemuMigrationCompressionPtr compression,
         return 0;
     }
 
-    for (i = QEMU_MIGRATION_COMPRESS_XBZRLE; i < QEMU_MIGRATION_COMPRESS_LAST; ++i) {
+    for (i = 0; i < QEMU_MIGRATION_COMPRESS_LAST; ++i) {
         if ((compression->methods & (1ULL << i)) &&
             virTypedParamsAddString(params, nparams, maxparams,
                                     VIR_MIGRATE_PARAM_COMPRESSION,
diff --git i/src/qemu/qemu_migration.h w/src/qemu/qemu_migration.h
index cb51ca5..ec5145b 100644
--- i/src/qemu/qemu_migration.h
+++ w/src/qemu/qemu_migration.h
@@ -81,7 +81,7 @@ VIR_ENUM_DECL(qemuMigrationJobPhase)
 
 typedef enum {
     QEMU_MIGRATION_COMPRESS_XBZRLE = 0,
-    QEMU_MIGRATION_COMPRESS_MULTITHREAD,
+    QEMU_MIGRATION_COMPRESS_MT,
 
     QEMU_MIGRATION_COMPRESS_LAST
 } qemuMigrationCompressMethod;
@@ -92,11 +92,13 @@ struct _qemuMigrationCompression {
 };
 
 qemuMigrationCompressionPtr
-qemuMigrationCompressionParse(virTypedParameterPtr params, int nparams,
+qemuMigrationCompressionParse(virTypedParameterPtr params,
+                              int nparams,
                               unsigned long flags);
 int qemuMigrationCompressionDump(qemuMigrationCompressionPtr compression,
                                  virTypedParameterPtr *params,
-                                 int *nparams, int *maxparams,
+                                 int *nparams,
+                                 int *maxparams,
                                  unsigned long *flags);
 
 int qemuMigrationJobStart(virQEMUDriverPtr driver,




More information about the libvir-list mailing list