]> xenbits.xensource.com Git - libvirt.git/commitdiff
Wire up virDomainMigrateSetSpeed into QEMU driver
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 17 Feb 2011 14:33:00 +0000 (14:33 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 22 Mar 2011 15:53:08 +0000 (15:53 +0000)
Enhance the QEMU migration monitoring loop, so that it can get
a signal to change migration speed on the fly

* src/qemu/qemu_domain.h: Add signal for changing speed on the fly
* src/qemu/qemu_driver.c: Wire up virDomainMigrateSetSpeed driver
* src/qemu/qemu_migration.c: Support signal for changing speed

src/qemu/qemu_domain.h
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c

index ebb2050345e6f7ff2526a5cb53a3b57117b24e8e..8258900893358d34ae3d27dd56d0625ccc19d832 100644 (file)
@@ -45,10 +45,12 @@ enum qemuDomainJobSignals {
     QEMU_JOB_SIGNAL_CANCEL  = 1 << 0, /* Request job cancellation */
     QEMU_JOB_SIGNAL_SUSPEND = 1 << 1, /* Request VM suspend to finish live migration offline */
     QEMU_JOB_SIGNAL_MIGRATE_DOWNTIME = 1 << 2, /* Request migration downtime change */
+    QEMU_JOB_SIGNAL_MIGRATE_SPEED = 1 << 3, /* Request migration speed change */
 };
 
 struct qemuDomainJobSignalsData {
     unsigned long long migrateDowntime; /* Data for QEMU_JOB_SIGNAL_MIGRATE_DOWNTIME */
+    unsigned long migrateBandwidth; /* Data for QEMU_JOB_SIGNAL_MIGRATE_SPEED */
 };
 
 typedef struct _qemuDomainPCIAddressSet qemuDomainPCIAddressSet;
index bc6e9dd74024d4a8565443a2b8492da22bd70514..6f296c9bfd339a8db1b88beb77123ea3a1e7183a 100644 (file)
@@ -6071,6 +6071,55 @@ cleanup:
     return ret;
 }
 
+static int
+qemuDomainMigrateSetMaxSpeed(virDomainPtr dom,
+                             unsigned long bandwidth,
+                             unsigned int flags)
+{
+    struct qemud_driver *driver = dom->conn->privateData;
+    virDomainObjPtr vm;
+    qemuDomainObjPrivatePtr priv;
+    int ret = -1;
+
+    virCheckFlags(0, -1);
+
+    qemuDriverLock(driver);
+    vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+
+    if (!vm) {
+        char uuidstr[VIR_UUID_STRING_BUFLEN];
+        virUUIDFormat(dom->uuid, uuidstr);
+        qemuReportError(VIR_ERR_NO_DOMAIN,
+                        _("no domain with matching uuid '%s'"), uuidstr);
+        goto cleanup;
+    }
+
+    if (!virDomainObjIsActive(vm)) {
+        qemuReportError(VIR_ERR_OPERATION_INVALID,
+                        "%s", _("domain is not running"));
+        goto cleanup;
+    }
+
+    priv = vm->privateData;
+
+    if (priv->jobActive != QEMU_JOB_MIGRATION_OUT) {
+        qemuReportError(VIR_ERR_OPERATION_INVALID,
+                        "%s", _("domain is not being migrated"));
+        goto cleanup;
+    }
+
+    VIR_DEBUG("Requesting migration speed change to %luMbs", bandwidth);
+    priv->jobSignals |= QEMU_JOB_SIGNAL_MIGRATE_SPEED;
+    priv->jobSignalsData.migrateBandwidth = bandwidth;
+    ret = 0;
+
+cleanup:
+    if (vm)
+        virDomainObjUnlock(vm);
+    qemuDriverUnlock(driver);
+    return ret;
+}
+
 static char *qemuFindQemuImgBinary(void)
 {
     char *ret;
@@ -7121,7 +7170,7 @@ static virDriver qemuDriver = {
     qemuDomainGetJobInfo, /* domainGetJobInfo */
     qemuDomainAbortJob, /* domainAbortJob */
     qemuDomainMigrateSetMaxDowntime, /* domainMigrateSetMaxDowntime */
-    NULL, /* domainMigrateSetMaxSpeed */
+    qemuDomainMigrateSetMaxSpeed, /* domainMigrateSetMaxSpeed */
     qemuDomainEventRegisterAny, /* domainEventRegisterAny */
     qemuDomainEventDeregisterAny, /* domainEventDeregisterAny */
     qemuDomainManagedSave, /* domainManagedSave */
index f450130bb4dbb9e985bd5cab07ac745712157cd5..826e1bf345be2baaf019bfc3b3c00daef27f891e 100644 (file)
@@ -144,6 +144,17 @@ qemuMigrationWaitForCompletion(struct qemud_driver *driver, virDomainObjPtr vm)
             qemuDomainObjExitMonitorWithDriver(driver, vm);
             if (rc < 0)
                 VIR_WARN0("Unable to set migration downtime");
+        } else if (priv->jobSignals & QEMU_JOB_SIGNAL_MIGRATE_SPEED) {
+            unsigned long bandwidth = priv->jobSignalsData.migrateBandwidth;
+
+            priv->jobSignals ^= QEMU_JOB_SIGNAL_MIGRATE_SPEED;
+            priv->jobSignalsData.migrateBandwidth = 0;
+            VIR_DEBUG("Setting migration bandwidth to %luMbs", bandwidth);
+            qemuDomainObjEnterMonitorWithDriver(driver, vm);
+            rc = qemuMonitorSetMigrationSpeed(priv->mon, bandwidth);
+            qemuDomainObjExitMonitorWithDriver(driver, vm);
+            if (rc < 0)
+                VIR_WARN0("Unable to set migration speed");
         }
 
         /* Repeat check because the job signals might have caused