]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Properly set //cpu/@migratable default value for running domains
authorJiri Denemark <jdenemar@redhat.com>
Wed, 15 Jul 2020 15:54:07 +0000 (17:54 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 21 Jul 2020 13:40:01 +0000 (15:40 +0200)
Since active domains which do not have the attribute already set were
not started by libvirt that probed for CPU migratable property, we need
to check this property on reconnect and update the domain definition
accordingly.

https://bugzilla.redhat.com/show_bug.cgi?id=1857967

Reported-by: Mark Mielke <mark.mielke@gmail.com>
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
src/qemu/qemu_process.c

index b985524258c6729b19d6ec7085c3ebca614a45a3..e8b15ee3cac3db28302a70661816cff3f1d05b4a 100644 (file)
@@ -7772,6 +7772,52 @@ qemuProcessRefreshDisks(virQEMUDriverPtr driver,
 }
 
 
+static int
+qemuProcessRefreshCPUMigratability(virQEMUDriverPtr driver,
+                                   virDomainObjPtr vm,
+                                   qemuDomainAsyncJob asyncJob)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    virDomainDefPtr def = vm->def;
+    bool migratable;
+    int rc;
+
+    if (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH)
+        return 0;
+
+    /* If the cpu.migratable capability is present, the migratable attribute
+     * is set correctly. */
+    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_CPU_MIGRATABLE))
+        return 0;
+
+    if (!ARCH_IS_X86(def->os.arch))
+        return 0;
+
+    if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+        return -1;
+
+    rc = qemuMonitorGetCPUMigratable(priv->mon, &migratable);
+
+    if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
+        return -1;
+
+    if (rc == 1)
+        migratable = false;
+
+    /* Libvirt 6.5.0 would set migratable='off' for running domains even though
+     * the actual default used by QEMU was 'on'. */
+    if (def->cpu->migratable == VIR_TRISTATE_SWITCH_OFF && migratable) {
+        VIR_DEBUG("Fixing CPU migratable attribute");
+        def->cpu->migratable = VIR_TRISTATE_SWITCH_ON;
+    }
+
+    if (def->cpu->migratable == VIR_TRISTATE_SWITCH_ABSENT)
+        def->cpu->migratable = virTristateSwitchFromBool(migratable);
+
+    return 0;
+}
+
+
 static int
 qemuProcessRefreshCPU(virQEMUDriverPtr driver,
                       virDomainObjPtr vm)
@@ -7787,6 +7833,9 @@ qemuProcessRefreshCPU(virQEMUDriverPtr driver,
     if (!vm->def->cpu)
         return 0;
 
+    if (qemuProcessRefreshCPUMigratability(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
+        return -1;
+
     if (!(host = virQEMUDriverGetHostCPU(driver))) {
         virResetLastError();
         return 0;