]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Use bitmap with migration capabilities
authorJiri Denemark <jdenemar@redhat.com>
Tue, 17 Oct 2017 20:00:35 +0000 (22:00 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 20 Oct 2017 11:37:03 +0000 (13:37 +0200)
All calls to qemuMonitorGetMigrationCapability in QEMU driver are
replaced with qemuMigrationCapsGet.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_driver.c
src/qemu/qemu_migration.c
src/qemu/qemu_migration.h

index e34b8be28451cb97bed6c3d4f23bc8665fbf7c73..ece8ee7dd21cc990ad9971fe6f6a0cfec44cf426 100644 (file)
@@ -10304,6 +10304,13 @@ qemuDomainCheckMigrationCapabilities(virQEMUDriverPtr driver,
         }
     }
 
+    /* Migration events capability must always be enabled, clearing it from
+     * migration capabilities bitmap makes sure it won't be touched anywhere
+     * else.
+     */
+    ignore_value(virBitmapClearBit(priv->migrationCaps,
+                                   QEMU_MONITOR_MIGRATION_CAPS_EVENTS));
+
     ret = 0;
 
  cleanup:
index d56992fbb17b42c4ea99ab09c61014bef2828d67..826d1340e0903dfd5e49125c79734d5be61acb2c 100644 (file)
@@ -13434,20 +13434,17 @@ qemuDomainMigrateGetCompressionCache(virDomainPtr dom,
 
     priv = vm->privateData;
 
-    qemuDomainObjEnterMonitor(driver, vm);
-
-    ret = qemuMonitorGetMigrationCapability(
-                priv->mon,
-                QEMU_MONITOR_MIGRATION_CAPS_XBZRLE);
-    if (ret == 0) {
+    if (!qemuMigrationCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_XBZRLE)) {
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                        _("Compressed migration is not supported by "
                          "QEMU binary"));
-        ret = -1;
-    } else if (ret > 0) {
-        ret = qemuMonitorGetMigrationCacheSize(priv->mon, cacheSize);
+        goto endjob;
     }
 
+    qemuDomainObjEnterMonitor(driver, vm);
+
+    ret = qemuMonitorGetMigrationCacheSize(priv->mon, cacheSize);
+
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
         ret = -1;
 
@@ -13488,21 +13485,18 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
 
     priv = vm->privateData;
 
-    qemuDomainObjEnterMonitor(driver, vm);
-
-    ret = qemuMonitorGetMigrationCapability(
-                priv->mon,
-                QEMU_MONITOR_MIGRATION_CAPS_XBZRLE);
-    if (ret == 0) {
+    if (!qemuMigrationCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_XBZRLE)) {
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                        _("Compressed migration is not supported by "
                          "QEMU binary"));
-        ret = -1;
-    } else if (ret > 0) {
-        VIR_DEBUG("Setting compression cache to %llu B", cacheSize);
-        ret = qemuMonitorSetMigrationCacheSize(priv->mon, cacheSize);
+        goto endjob;
     }
 
+    qemuDomainObjEnterMonitor(driver, vm);
+
+    VIR_DEBUG("Setting compression cache to %llu B", cacheSize);
+    ret = qemuMonitorSetMigrationCacheSize(priv->mon, cacheSize);
+
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
         ret = -1;
 
index 57544ee8370ba548906d97ae3f90eb5c560361a5..e299b6b852922a97a169cb53fa7b1935015f473d 100644 (file)
@@ -1274,17 +1274,12 @@ qemuMigrationSetOption(virQEMUDriverPtr driver,
     qemuDomainObjPrivatePtr priv = vm->privateData;
     int ret;
 
-    if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
-        return -1;
-
-    ret = qemuMonitorGetMigrationCapability(priv->mon, capability);
+    if (!qemuMigrationCapsGet(vm, capability)) {
+        if (!state) {
+            /* Unsupported but we want it off anyway */
+            return 0;
+        }
 
-    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,
                            _("Migration option '%s' is not supported by "
@@ -1296,15 +1291,17 @@ qemuMigrationSetOption(virQEMUDriverPtr driver,
                              "source QEMU binary"),
                            qemuMonitorMigrationCapsTypeToString(capability));
         }
-        ret = -1;
-        goto cleanup;
+        return -1;
     }
 
+    if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
+        return -1;
+
     ret = qemuMonitorSetMigrationCapability(priv->mon, capability, state);
 
- cleanup:
     if (qemuDomainObjExitMonitor(driver, vm) < 0)
         ret = -1;
+
     return ret;
 }
 
@@ -5928,12 +5925,8 @@ qemuMigrationReset(virQEMUDriverPtr driver,
         goto cleanup;
 
     for (cap = 0; cap < QEMU_MONITOR_MIGRATION_CAPS_LAST; cap++) {
-        /* "events" capability is set (when supported) in qemuConnectMonitor
-         * and should never be cleared */
-        if (cap == QEMU_MONITOR_MIGRATION_CAPS_EVENTS)
-            continue;
-
-        if (qemuMigrationSetOption(driver, vm, cap, false, job) < 0)
+        if (qemuMigrationCapsGet(vm, cap) &&
+            qemuMigrationSetOption(driver, vm, cap, false, job) < 0)
             goto cleanup;
     }
 
@@ -5994,3 +5987,17 @@ qemuMigrationFetchMirrorStats(virQEMUDriverPtr driver,
     virHashFree(blockinfo);
     return 0;
 }
+
+
+bool
+qemuMigrationCapsGet(virDomainObjPtr vm,
+                     qemuMonitorMigrationCaps cap)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    bool enabled = false;
+
+    if (priv->migrationCaps)
+        ignore_value(virBitmapGetBit(priv->migrationCaps, cap, &enabled));
+
+    return enabled;
+}
index 63a43256242cf40248e8e1e5804bfa8de272e799..f634138f4db756ca341eb2d55930829d9ef2ff62 100644 (file)
@@ -326,4 +326,8 @@ qemuMigrationFetchMirrorStats(virQEMUDriverPtr driver,
                               qemuDomainAsyncJob asyncJob,
                               qemuDomainJobInfoPtr jobInfo);
 
+bool
+qemuMigrationCapsGet(virDomainObjPtr vm,
+                     qemuMonitorMigrationCaps cap);
+
 #endif /* __QEMU_MIGRATION_H__ */