[PATCH v1 1/2] qemu: driver: use model name "host" for mode "host-passthrough"

Collin Walling walling at linux.ibm.com
Thu Sep 24 02:26:28 UTC 2020


When executing the hypervisor-cpu-compare/baseline commands and
the XML file contains a CPU definition using host-passthrough
and no model name, the commands will fail and return an error
message from the QMP response.

Let's fix this by checking for host-passthrough and a missing
model name after the CPU definition has been converted from
XML. If these conditions are matched, then the CPU definition's
model name will be set to "host".

Signed-off-by: Collin Walling <walling at linux.ibm.com>
---
 src/qemu/qemu_driver.c | 41 +++++++++++++++++++++++++++++++----------
 1 file changed, 31 insertions(+), 10 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 1cecef01f7..427d2419f3 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12281,6 +12281,26 @@ qemuConnectCPUModelComparison(virQEMUCapsPtr qemuCaps,
 }
 
 
+static int
+qemuConnectCheckCPUModel(virCPUDefPtr cpu)
+{
+    if (!cpu->model) {
+        /*
+         * On some architectures a model name is never present
+         * for the host-passthrough mode, so default it to "host"
+         */
+        if (cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) {
+            cpu->model = g_strdup("host");
+        } else {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("cpu parameter is missing a model name"));
+            return -1;
+        }
+    }
+    return 0;
+}
+
+
 static int
 qemuConnectCompareHypervisorCPU(virConnectPtr conn,
                                 const char *emulator,
@@ -12336,15 +12356,9 @@ qemuConnectCompareHypervisorCPU(virConnectPtr conn,
         if (virCPUDefParseXMLString(xmlCPU, VIR_CPU_TYPE_AUTO, &cpu) < 0)
             goto cleanup;
 
-        if (!cpu->model) {
-            if (cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) {
-                cpu->model = g_strdup("host");
-            } else {
-                virReportError(VIR_ERR_INVALID_ARG, "%s",
-                               _("cpu parameter is missing a model name"));
-                goto cleanup;
-            }
-        }
+        if (qemuConnectCheckCPUModel(cpu) < 0)
+            goto cleanup;
+
         ret = qemuConnectCPUModelComparison(qemuCaps, cfg->libDir,
                                             cfg->user, cfg->group,
                                             hvCPU, cpu, failIncompatible);
@@ -12470,10 +12484,17 @@ qemuConnectCPUModelBaseline(virQEMUCapsPtr qemuCaps,
     if (VIR_ALLOC(baseline) < 0)
         return NULL;
 
-    if (virCPUDefCopyModel(baseline, cpus[0], false))
+    if (qemuConnectCheckCPUModel(cpus[0]) < 0)
+        return NULL;
+
+    if (virCPUDefCopyModel(baseline, cpus[0], false) < 0)
         return NULL;
 
     for (i = 1; i < ncpus; i++) {
+
+        if (qemuConnectCheckCPUModel(cpus[i]) < 0)
+            return NULL;
+
         if (qemuMonitorGetCPUModelBaseline(proc->mon, baseline,
                                            cpus[i], &result) < 0)
             return NULL;
-- 
2.26.2




More information about the libvir-list mailing list