[libvirt] [PATCH v4 4/5] qemu: migration: add compression options

Jiri Denemark jdenemar at redhat.com
Tue Mar 22 13:49:18 UTC 2016


On Fri, Mar 04, 2016 at 14:20:57 +0300, Nikolay Shirokovskiy wrote:
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---
>  include/libvirt/libvirt-domain.h | 33 ++++++++++++++++
>  src/qemu/qemu_migration.c        | 85 +++++++++++++++++++++++++++++++++++++++-
>  src/qemu/qemu_migration.h        |  7 ++++
>  3 files changed, 124 insertions(+), 1 deletion(-)
> 
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index b3a176f..59df373 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -784,6 +784,39 @@ typedef enum {
>  
>  # define VIR_MIGRATE_PARAM_COMPRESSION    "compression"
>  
> +/**
> + * VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL:
> + *
> + * virDomainMigrate* params field: the level of compression for multithread
> + * compression as VIR_TYPED_PARAM_INT. Accepted values * are in range 0-9.

Looks like a leftover '*' --------------------------------^

> + * 0 is no compression, 1 is maximum speed and 9 is maximum compression.
> + */
> +# define VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL    "compression.mt.level"

Then name of the compression method in individual parameters should
match the name passed to VIR_MIGRATE_PARAM_COMPRESSION. That is, either
change the method name to "mt" or use "compression.multithread." prefix
for additional parameters.

> +
> +/**
> + * VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS:
> + *
> + * virDomainMigrate* params field: the number of compression threads for
> + * multithread compression as VIR_TYPED_PARAM_INT.
> + */
> +# define VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS "compression.mt.threads"
> +
> +/**
> + * VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS:
> + *
> + * virDomainMigrate* params field: the number of decompression threads for
> + * multithread compression as VIR_TYPED_PARAM_INT.
> + */
> +# 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_migration.c b/src/qemu/qemu_migration.c
> index 5fcf132..88d62a9 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
...
> @@ -6379,6 +6401,41 @@ qemuMigrationCompressionParseParams(qemuMigrationCompressionPtr compression,
>          }
>      }
>  
> +#define VIR_GET_PARAMETER_OPT(PARAM, TYPE, PARENT, VALUE)               \

The name of this macro is long while still generic. Since it is a local
macro, I think you can use a short name, such as GET_PARAM.

> +    if ((rc = virTypedParamsGet ## TYPE(params, nparams,                \
> +                                         PARAM, &PARENT->VALUE)) < 0)   \
> +        return -1;                                                      \
> +                                                                        \
> +    if (rc == 1)                                                        \
> +        PARENT->VALUE ## _set = 1;

Anyway, the macro needs to be enclosed in do { } while () so that you
can use semicolon when calling it.

> +
> +    VIR_GET_PARAMETER_OPT(VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL,
> +                          Int, cparams, level)

Semicolon should go here ------------------------^

> +    VIR_GET_PARAMETER_OPT(VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS,
> +                          Int, cparams, threads)
> +    VIR_GET_PARAMETER_OPT(VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS,
> +                          Int, cparams, dthreads)
> +    VIR_GET_PARAMETER_OPT(VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE,
> +                          ULLong, compression, xbzrle_cache)
> +
> +#undef VIR_GET_PARAMETER_OPT
> +
> +    if ((cparams->level_set || cparams->threads_set || cparams->dthreads_set) &&
> +        !(compression->methods & QEMU_MIGRATION_COMPESS_MULTITHREAD)) {
> +        virReportError(VIR_ERR_INVALID_ARG, "%s",
> +                       _("You cannot specify multithread compression "
> +                         "parameters without turning it on."));

We don't use '.' at the end of error messages. And I'd also avoid
pointing at the user with "You".

> +        return -1;
> +    }
> +
> +    if (compression->xbzrle_cache_set &&
> +        !(compression->methods & QEMU_MIGRATION_COMPESS_XBZRLE)) {
> +        virReportError(VIR_ERR_INVALID_ARG, "%s",
> +                       _("You cannot specify xbzrle compression "
> +                         "parameters without turning it on."));

Ditto.

> +        return -1;
> +    }
> +
>      return 0;
>  }
>  
...

Jirka




More information about the libvir-list mailing list