]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Make sure host-model uses CPU model supported by QEMU
authorJiri Denemark <jdenemar@redhat.com>
Thu, 7 Dec 2017 10:23:50 +0000 (11:23 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 8 Dec 2017 14:50:52 +0000 (15:50 +0100)
When reconnecting to a running domain started by old libvirt, which did
not change host-model into a custom CPU definition, we replace the CPU
definition with a specific CPU model from host capabilities. However,
that CPU model may not be supported by the running qemu process. We need
to translate the CPU model to one of the models which libvirt could have
used when starting the domain.

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

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_process.c

index 93a24cde15503c57908fc1be2020e6a1188b0dc0..a0f430f89f06f6bd2d4d5940cb6fd25e36655608 100644 (file)
@@ -3853,6 +3853,30 @@ qemuProcessUpdateAndVerifyCPU(virQEMUDriverPtr driver,
 }
 
 
+static virDomainCapsCPUModelsPtr
+qemuProcessFetchCPUDefinitions(virQEMUDriverPtr driver,
+                               virDomainObjPtr vm,
+                               qemuDomainAsyncJob asyncJob)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    virDomainCapsCPUModelsPtr models = NULL;
+
+    if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+        goto error;
+
+    models = virQEMUCapsFetchCPUDefinitions(priv->mon);
+
+    if (qemuDomainObjExitMonitor(driver, vm) < 0)
+        goto error;
+
+    return models;
+
+ error:
+    virObjectUnref(models);
+    return NULL;
+}
+
+
 static int
 qemuProcessUpdateCPU(virQEMUDriverPtr driver,
                      virDomainObjPtr vm,
@@ -3860,6 +3884,7 @@ qemuProcessUpdateCPU(virQEMUDriverPtr driver,
 {
     virCPUDataPtr cpu = NULL;
     virCPUDataPtr disabled = NULL;
+    virDomainCapsCPUModelsPtr models = NULL;
     int ret = -1;
 
     if (qemuProcessFetchGuestCPU(driver, vm, asyncJob, &cpu, &disabled) < 0)
@@ -3868,11 +3893,16 @@ qemuProcessUpdateCPU(virQEMUDriverPtr driver,
     if (qemuProcessUpdateLiveGuestCPU(vm, cpu, disabled) < 0)
         goto cleanup;
 
+    if (!(models = qemuProcessFetchCPUDefinitions(driver, vm, asyncJob)) ||
+        virCPUTranslate(vm->def->os.arch, vm->def->cpu, models) < 0)
+        goto cleanup;
+
     ret = 0;
 
  cleanup:
     virCPUDataFree(cpu);
     virCPUDataFree(disabled);
+    virObjectUnref(models);
     return ret;
 }