[libvirt] [PATCH v3 5/7] qemu migration: add multithread compression options
Maxim Nestratov
mnestratov at virtuozzo.com
Sat Jan 30 17:21:11 UTC 2016
28.01.2016 10:04, Nikolay Shirokovskiy пишет:
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
Again, I miss some description in commit message.
Otherwise ACK.
> ---
> include/libvirt/libvirt-domain.h | 25 ++++++++++++++++++++++++-
> src/qemu/qemu_domain.c | 3 +++
> src/qemu/qemu_domain.h | 1 +
> src/qemu/qemu_driver.c | 27 ++++++++++++++++++++++++++-
> src/qemu/qemu_migration.c | 36 ++++++++++++++++++++++++++++++++++--
> src/qemu/qemu_migration.h | 6 ++++++
> 6 files changed, 94 insertions(+), 4 deletions(-)
>
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index e868515..36f6e09 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -764,9 +764,32 @@ typedef enum {
> * that are used to compress migration traffic. Note that this option cannot
> * be used together with VIR_MIGRATE_COMPRESSED flag, use only one of them.
> */
> -
> # 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.
> + * 0 is no compression, 1 is maximum speed and 9 is maximum compression.
> + */
> +# define VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL "compression.mt.level"
> +
> +/**
> + * VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS:
> + *
> + * virDomainMigrate* params field: the number of compression threads for
> + * multithread compression as VIR_TYPED_PARAM_UINT.
> + */
> +# 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_UINT.
> + */
> +# define VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS "compression.mt.dthreads"
>
> /* Domain migration. */
> virDomainPtr virDomainMigrate (virDomainPtr domain, virConnectPtr dconn,
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 1df1b74..03ddee2 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -491,6 +491,9 @@ qemuDomainObjPrivateAlloc(void)
> goto error;
>
> priv->migMaxBandwidth = QEMU_DOMAIN_MIG_BANDWIDTH_MAX;
> + priv->migrationMT.level = 1;
> + priv->migrationMT.threads = 8;
> + priv->migrationMT.dthreads = 2;
Why not to define those defaults in qemu_domain.h and explain why such
numbers are chosen?
>
> return priv;
>
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 7fc4fff..48554cd 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -182,6 +182,7 @@ struct _qemuDomainObjPrivate {
> int nbdPort; /* Port used for migration with NBD */
> unsigned short migrationPort;
> int preMigrationState;
> + qemuMonitorMigrationMTParameters migrationMT;
>
> virChrdevsPtr devs;
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 129da6d..eb3fd80 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -12418,7 +12418,7 @@ qemuGetCompression(virTypedParameterPtr params, int nparams,
> {
> size_t i;
>
> - memset(compression, 0, sizeof(*compression));
> + qemuMigrationCompressionInit(compression);
>
> for (i = 0; i < nparams; i++) {
> if (STRNEQ(params[i].field, VIR_MIGRATE_PARAM_COMPRESSION))
> @@ -12448,6 +12448,31 @@ qemuGetCompression(virTypedParameterPtr params, int nparams,
> }
> }
>
> + if ((virTypedParamsGet(params, nparams,
> + VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL) != NULL ||
> + virTypedParamsGet(params, nparams,
> + VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS) != NULL ||
> + virTypedParamsGet(params, nparams,
> + VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS) != NULL) &&
> + !(compression->method & QEMU_MIGRATION_COMPESS_MULTITHREAD)) {
> + virReportError(VIR_ERR_INVALID_ARG, "%s",
> + _("You cannot specify multithread compression "
> + "parameters without turning it on."));
> + return -1;
> + }
> +
> + if (virTypedParamsGetInt(params, nparams,
> + VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL,
> + &compression->mt.level) < 0 ||
> + virTypedParamsGetUInt(params, nparams,
> + VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS,
> + &compression->mt.threads) < 0 ||
> + virTypedParamsGetUInt(params, nparams,
> + VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS,
> + &compression->mt.dthreads) < 0) {
> + return -1;
> + }
> +
> return 0;
> }
>
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index d37e416..81ff6b3 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -3307,9 +3307,12 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
> unsigned int flags)
> {
> qemuMigrationCompression deflt;
> + qemuMigrationCompression merged;
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> + int ret = -1;
>
> if (!compression) {
> - memset(&deflt, 0, sizeof(deflt));
> + qemuMigrationCompressionInit(&deflt);
> if (flags & VIR_MIGRATE_COMPRESSED)
> deflt.method = QEMU_MIGRATION_COMPESS_XBZRLE;
> compression = &deflt;
> @@ -3327,7 +3330,30 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
> job) < 0)
> return -1;
>
> - return 0;
> + merged.mt.level = compression->mt.level != -1 ?
> + compression->mt.level :
> + priv->migrationMT.level;
> + merged.mt.threads = compression->mt.threads != 0 ?
> + compression->mt.threads:
> + priv->migrationMT.threads;
> + merged.mt.dthreads = compression->mt.dthreads != 0 ?
> + compression->mt.dthreads :
> + priv->migrationMT.dthreads;
> +
> + if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
> + return -1;
> +
> + if ((compression->method & QEMU_MIGRATION_COMPESS_MULTITHREAD) &&
> + qemuMonitorSetMigrationCompressParametersMT(priv->mon, &merged.mt) < 0)
> + goto cleanup;
> +
> + ret = 0;
> +
> + cleanup:
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
> +
> + return ret;
> }
>
> static int
> @@ -6358,3 +6384,9 @@ qemuMigrationErrorReport(virQEMUDriverPtr driver,
> virSetError(err);
> virFreeError(err);
> }
> +
> +void qemuMigrationCompressionInit(qemuMigrationCompressionPtr compression)
> +{
> + memset(compression, 0, sizeof(*compression));
> + compression->mt.level = -1;
> +}
> diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
> index 45de616..63c6a1a 100644
> --- a/src/qemu/qemu_migration.h
> +++ b/src/qemu/qemu_migration.h
> @@ -58,6 +58,9 @@ typedef qemuMigrationCompression *qemuMigrationCompressionPtr;
> VIR_TYPED_PARAM_MULTIPLE, \
> VIR_MIGRATE_PARAM_COMPRESSION, VIR_TYPED_PARAM_STRING | \
> VIR_TYPED_PARAM_MULTIPLE, \
> + 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, \
> NULL
>
>
> @@ -84,8 +87,11 @@ typedef enum {
>
> struct _qemuMigrationCompression {
> qemuMigrationCompressMethod method;
> + qemuMonitorMigrationMTParameters mt;
> };
>
> +void qemuMigrationCompressionInit(qemuMigrationCompressionPtr compression);
> +
> int qemuMigrationJobStart(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> qemuDomainAsyncJob job)
More information about the libvir-list
mailing list