[libvirt] [PATCH V2 1/9] qemu_migration: Add support for mutil-thread compressed migration enable

Feng, Shaohe shaohe.feng at intel.com
Sat Nov 7 15:06:03 UTC 2015


> 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 at redhat.com]
> Sent: Thursday, October 15, 2015 5:15 PM
> To: Feng, Shaohe
> Cc: libvir-list at 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 at intel.com>
> > Signed-off-by: ShaoHe Feng <shaohe.feng at 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




More information about the libvir-list mailing list