However, since we already have VIR_MIGRATE_COMPRESSED flag and I can
imagine various other hypervisors could support
their own compression methods, I think using flags for selecting the compression method
is wrong. So what if we keep just
VIR_MIGRATE_COMPRESSED flag and introduce a new migration parameter to let the user
select what compression method
they want to use (XBZRLE, multithreaded compression, ...) and each of them could be
further configurable with additional
parameters. Each hypervisor would also advertise a list of supported compression methods
via
virConnectGetDomainCapabilities. QEMU would have XBZRLE method selected by default for
backward compatibility (it would
have to be advertised as the default method in virConnectGetDomainCapabilities too).
Hi, Jiri.
I have check the domcapabilities.
There is no any compression info from domcapabilities.
Do you means we need to add a new element of domainCapabilities as follow:
<domainCapabilities>
<migration>
< XBZRLE supported='yes'>
</ XBZRLE >
< mutil-thread supported='yes'>
<method >
<value>xz</value>
</method >
<level >
<value>8</value>
</ level >
<compress-counter>
<value>4</value>
</ compress-counter >
<decompress-counter>
<value>2</value>
</decompress-counter >
</ mutil-thread >
</ migration >
</domainCapabilities>
virsh # domcapabilities
<domainCapabilities>
<path>/home/shaohe/qemu/bin/debug/native/x86_64-softmmu/qemu-system-x86_64</path>
<domain>qemu</domain>
<machine>pc-i440fx-2.4</machine>
<arch>x86_64</arch>
<vcpu max='255'/>
<os supported='yes'>
<loader supported='yes'>
<enum name='type'>
<value>rom</value>
<value>pflash</value>
</enum>
<enum name='readonly'>
<value>yes</value>
<value>no</value>
</enum>
</loader>
</os>
<devices>
<disk supported='yes'>
<enum name='diskDevice'>
<value>disk</value>
<value>cdrom</value>
<value>floppy</value>
<value>lun</value>
</enum>
<enum name='bus'>
<value>ide</value>
<value>fdc</value>
<value>scsi</value>
<value>virtio</value>
<value>usb</value>
</enum>
</disk>
<hostdev supported='yes'>
<enum name='mode'>
<value>subsystem</value>
</enum>
<enum name='startupPolicy'>
<value>default</value>
<value>mandatory</value>
<value>requisite</value>
<value>optional</value>
</enum>
<enum name='subsysType'>
<value>usb</value>
<value>pci</value>
<value>scsi</value>
</enum>
<enum name='capsType'/>
<enum name='pciBackend'/>
</hostdev>
</devices>
</domainCapabilities>
-----Original Message-----
From: Jiri Denemark [mailto:jdenemar@redhat.com]
Sent: Thursday, October 15, 2015 5:15 PM
To: Feng, Shaohe
Cc: libvir-list(a)redhat.com; Li, Liang Z; Qiao, Liyong
Subject: Re: [PATCH V2 1/9] qemu_migration: Add support for mutil-thread compressed
migration enable
On Thu, Jul 09, 2015 at 21:01:49 +0800, ShaoHe Feng wrote:
> We need to set the mutil-thread compress capability as true to enable it.
>
> Signed-off-by: Eli Qiao <liyong.qiao(a)intel.com>
> Signed-off-by: ShaoHe Feng <shaohe.feng(a)intel.com>
> ---
> .gnulib | 2 +-
> src/qemu/qemu_migration.c | 56
> +++++++++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_migration.h | 9 +++++++-
> src/qemu/qemu_monitor.c | 2 +-
> src/qemu/qemu_monitor.h | 1 +
> 5 files changed, 67 insertions(+), 3 deletions(-)
>
> diff --git a/.gnulib b/.gnulib
> index f39477d..875ec93 160000
> --- a/.gnulib
> +++ b/.gnulib
> @@ -1 +1 @@
> -Subproject commit f39477dba778e99392948dd3dd19ec0d46aee932
> +Subproject commit 875ec93e1501d2d2a8bab1b64fa66b8ceb51dc67
Drop this change to .gnulib
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 7257182..891ddb6 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -2343,6 +2343,52 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
> return ret;
> }
>
> +int
> +qemuMigrationSetMultiThreadCompression(virQEMUDriverPtr driver,
> + virDomainObjPtr vm,
> + bool state,
> + qemuDomainAsyncJob job) {
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> + int ret = -1;
> +
> + if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
> + return -1;
> +
> + ret = qemuMonitorGetMigrationCapability(
> + priv->mon,
> + QEMU_MONITOR_MIGRATION_CAPS_MT_COMPRESS);
Some people don't like this formatting and prefer
ret = qemuMonitorGetMigrationCapability(priv->mon,
QEMU_MONITOR_MIGRATION_CAPS_MT_COMPRESS);
even though the result is longer than 80 characters. I don't mind either way so
it's up to you if you want to change it or not :-)
[1]
> +
> + if (ret < 0) {
> + goto cleanup;
> + } else if (ret == 0 && !state) {
> + /* Unsupported but we want it off anyway */
> + goto cleanup;
> + } else if (ret == 0) {
> + if (job == QEMU_ASYNC_JOB_MIGRATION_IN) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("Multi-thread compressed migration is not
supported by "
> + "target QEMU binary"));
Split the error message in two lines earlier so that both lines fit within 80 columns.
> + } else {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("Multi-thread compressed migration is not
supported by "
> + "source QEMU binary"));
And here as well.
> + }
> + ret = -1;
> + goto cleanup;
> + }
> +
> + ret = qemuMonitorSetMigrationCapability(
> + priv->mon,
> + QEMU_MONITOR_MIGRATION_CAPS_MT_COMPRESS,
> + state);
[1] applies here too.
> +
> + cleanup:
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
> + return ret;
> +}
> +
> static int
> qemuMigrationSetAutoConverge(virQEMUDriverPtr driver,
> virDomainObjPtr vm, @@ -3374,6 +3420,11
> @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
> QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
> goto stop;
>
> + if (qemuMigrationSetMultiThreadCompression(driver, vm,
> + flags &
> + VIR_MIGRATE_MT_COMPRESSED,
This won't compile because the public flag is introduced later in patch 6/9. The
introduction of this flag must either be moved
here or to an earlier standalone patch. Remember, "make all check syntax-check"
should pass after every single patch in a
series.
However, since we already have VIR_MIGRATE_COMPRESSED flag and I can imagine various
other hypervisors could support
their own compression methods, I think using flags for selecting the compression method
is wrong. So what if we keep just
VIR_MIGRATE_COMPRESSED flag and introduce a new migration parameter to let the user
select what compression method
they want to use (XBZRLE, multithreaded compression, ...) and each of them could be
further configurable with additional
parameters. Each hypervisor would also advertise a list of supported compression methods
via
virConnectGetDomainCapabilities. QEMU would have XBZRLE method selected by default for
backward compatibility (it would
have to be advertised as the default method in virConnectGetDomainCapabilities too).
So what about something like
/* compression method */
#define VIR_MIGRATE_PARAM_COMPRESSION "compression"
/* XBZRLE parameters */
#define VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE "compression.xbzrle.cache"
/* multithreaded compression parameters */ #define
VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL
"compression.mt.level"
#define VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS "compression.mt.threads"
#define VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS "compression.mt.dthreads"
Jirka