[libvirt] [PATCH v2] libvirt support to force convergence of live guest migration
Jiri Denemark
jdenemar at redhat.com
Fri Mar 21 13:26:35 UTC 2014
On Thu, Feb 06, 2014 at 15:44:36 -0800, Chegu Vinod wrote:
> Hello,
> 'am sending this updated patch as an attachment (as I was having some
> issues with my smtp server and git send-email setup).
> Thanks,
> Vinod
>
>
> Subject: [PATCH v2] libvirt support to force convergence of live guest migration
>
> Changes since RFC (i.e. v1) patch :
> - Incorporated feedback from Jiri Denemark
>
> Busy enterprise workloads hosted on large sized VM's tend to dirty
> memory faster than the transfer rate achieved via live guest migration.
> Despite some good recent improvements (& using dedicated 10Gig NICs
> between hosts) the live migration may NOT converge.
>
> Recently support was added in qemu (version 1.6) to allow a user to
> choose if they wish to force convergence of their migration via a
> new migration capability : "auto-converge". This feature allows for qemu
> to auto-detect lack of convergence and trigger a throttle-down of the
> VCPUs.
>
> This patch includes the libvirt support needed to trigger this
> feature. (Testing is in progress)
>
> Signed-off-by: Chegu Vinod <chegu_vinod at hp.com>
> ---
> include/libvirt/libvirt.h.in | 1 +
> src/qemu/qemu_migration.c | 40 ++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_migration.h | 3 ++-
> src/qemu/qemu_monitor.c | 2 +-
> src/qemu/qemu_monitor.h | 1 +
> tools/virsh-domain.c | 7 +++++++
> 6 files changed, 52 insertions(+), 2 deletions(-)
>
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index 295d551..c0fc08b 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -1200,6 +1200,7 @@ typedef enum {
> VIR_MIGRATE_OFFLINE = (1 << 10), /* offline migrate */
> VIR_MIGRATE_COMPRESSED = (1 << 11), /* compress data during migration */
> VIR_MIGRATE_ABORT_ON_ERROR = (1 << 12), /* abort migration on I/O errors happened during migration */
> + VIR_MIGRATE_AUTO_CONVERGE = (1 << 13), /* force convergence */
> } virDomainMigrateFlags;
Since VIR_MIGRATE_AUTO_CONVERGE is a source-only flag now (destination
host does not do anything if it sees it), we should not even send it
there. Otherwise migration with this flag set would be impossible to a
host with older libvirtd that does not support this new flag. It is the
same situation as with VIR_MIGRATE_ABORT_ON_ERROR. Otherwise the patch
is good. And since it took me so long to look at this patch (I was sick
and then I forgot about it), I fixed this for you.
ACK with the following patch squashed in and pushed.
Jirka
diff --git i/src/libvirt.c w/src/libvirt.c
index 2201b07..c5c3136 100644
--- i/src/libvirt.c
+++ w/src/libvirt.c
@@ -4408,7 +4408,8 @@ virDomainMigrateVersion1(virDomainPtr domain,
if (ret == 0 && info.state == VIR_DOMAIN_PAUSED)
flags |= VIR_MIGRATE_PAUSED;
- destflags = flags & ~VIR_MIGRATE_ABORT_ON_ERROR;
+ destflags = flags & ~(VIR_MIGRATE_ABORT_ON_ERROR |
+ VIR_MIGRATE_AUTO_CONVERGE);
/* Prepare the migration.
*
@@ -4538,7 +4539,8 @@ virDomainMigrateVersion2(virDomainPtr domain,
if (ret == 0 && info.state == VIR_DOMAIN_PAUSED)
flags |= VIR_MIGRATE_PAUSED;
- destflags = flags & ~VIR_MIGRATE_ABORT_ON_ERROR;
+ destflags = flags & ~(VIR_MIGRATE_ABORT_ON_ERROR |
+ VIR_MIGRATE_AUTO_CONVERGE);
VIR_DEBUG("Prepare2 %p flags=%lx", dconn, destflags);
ret = dconn->driver->domainMigratePrepare2
@@ -4710,7 +4712,8 @@ virDomainMigrateVersion3Full(virDomainPtr domain,
if (ret == 0 && state == VIR_DOMAIN_PAUSED)
flags |= VIR_MIGRATE_PAUSED;
- destflags = flags & ~VIR_MIGRATE_ABORT_ON_ERROR;
+ destflags = flags & ~(VIR_MIGRATE_ABORT_ON_ERROR |
+ VIR_MIGRATE_AUTO_CONVERGE);
VIR_DEBUG("Prepare3 %p flags=%x", dconn, destflags);
cookiein = cookieout;
diff --git i/src/qemu/qemu_migration.c w/src/qemu/qemu_migration.c
index cbb3d2f..57e2436 100644
--- i/src/qemu/qemu_migration.c
+++ w/src/qemu/qemu_migration.c
@@ -3627,7 +3627,8 @@ static int doPeer2PeerMigrate2(virQEMUDriverPtr driver,
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED)
flags |= VIR_MIGRATE_PAUSED;
- destflags = flags & ~VIR_MIGRATE_ABORT_ON_ERROR;
+ destflags = flags & ~(VIR_MIGRATE_ABORT_ON_ERROR |
+ VIR_MIGRATE_AUTO_CONVERGE);
VIR_DEBUG("Prepare2 %p", dconn);
if (flags & VIR_MIGRATE_TUNNELLED) {
@@ -3820,7 +3821,8 @@ doPeer2PeerMigrate3(virQEMUDriverPtr driver,
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED)
flags |= VIR_MIGRATE_PAUSED;
- destflags = flags & ~VIR_MIGRATE_ABORT_ON_ERROR;
+ destflags = flags & ~(VIR_MIGRATE_ABORT_ON_ERROR |
+ VIR_MIGRATE_AUTO_CONVERGE);
VIR_DEBUG("Prepare3 %p", dconn);
cookiein = cookieout;
More information about the libvir-list
mailing list