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

Maxim Nestratov mnestratov at virtuozzo.com
Sat Jan 30 17:27:56 UTC 2016


28.01.2016 10:04, Nikolay Shirokovskiy пишет:
> 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);
ACK




More information about the libvir-list mailing list