[libvirt] [PATCH 17/22] qemu: Probe for default CPU types

Jiri Denemark jdenemar at redhat.com
Thu Oct 3 14:00:35 UTC 2019


QEMU 4.2.0 will report default CPU types used by each machine type and
we will want to start using it.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 src/qemu/qemu_capabilities.c                  | 15 ++-
 src/qemu/qemu_monitor.c                       |  1 +
 src/qemu/qemu_monitor.h                       |  1 +
 src/qemu/qemu_monitor_json.c                  | 12 +++
 .../caps_4.2.0.x86_64.xml                     | 92 +++++++++----------
 5 files changed, 73 insertions(+), 48 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 24ef623458..802d3f7e1a 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -552,6 +552,7 @@ struct virQEMUCapsMachineType {
     unsigned int maxCpus;
     bool hotplugCpus;
     bool qemuDefault;
+    char *defaultCPU;
 };
 
 typedef struct _virQEMUCapsHostCPUData virQEMUCapsHostCPUData;
@@ -1630,7 +1631,8 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
     ret->nmachineTypes = qemuCaps->nmachineTypes;
     for (i = 0; i < qemuCaps->nmachineTypes; i++) {
         if (VIR_STRDUP(ret->machineTypes[i].name, qemuCaps->machineTypes[i].name) < 0 ||
-            VIR_STRDUP(ret->machineTypes[i].alias, qemuCaps->machineTypes[i].alias) < 0)
+            VIR_STRDUP(ret->machineTypes[i].alias, qemuCaps->machineTypes[i].alias) < 0 ||
+            VIR_STRDUP(ret->machineTypes[i].defaultCPU, qemuCaps->machineTypes[i].defaultCPU) < 0)
             goto error;
         ret->machineTypes[i].maxCpus = qemuCaps->machineTypes[i].maxCpus;
         ret->machineTypes[i].hotplugCpus = qemuCaps->machineTypes[i].hotplugCpus;
@@ -1665,6 +1667,7 @@ void virQEMUCapsDispose(void *obj)
     for (i = 0; i < qemuCaps->nmachineTypes; i++) {
         VIR_FREE(qemuCaps->machineTypes[i].name);
         VIR_FREE(qemuCaps->machineTypes[i].alias);
+        VIR_FREE(qemuCaps->machineTypes[i].defaultCPU);
     }
     VIR_FREE(qemuCaps->machineTypes);
 
@@ -2398,7 +2401,8 @@ virQEMUCapsProbeQMPMachineTypes(virQEMUCapsPtr qemuCaps,
         mach = &(qemuCaps->machineTypes[qemuCaps->nmachineTypes++]);
 
         if (VIR_STRDUP(mach->alias, machines[i]->alias) < 0 ||
-            VIR_STRDUP(mach->name, machines[i]->name) < 0)
+            VIR_STRDUP(mach->name, machines[i]->name) < 0 ||
+            VIR_STRDUP(mach->defaultCPU, machines[i]->defaultCPU) < 0)
             goto cleanup;
 
         mach->maxCpus = machines[i]->maxCpus;
@@ -3775,6 +3779,8 @@ virQEMUCapsLoadCache(virArch hostArch,
             if (STREQ_NULLABLE(str, "yes"))
                 qemuCaps->machineTypes[i].qemuDefault = true;
             VIR_FREE(str);
+
+            qemuCaps->machineTypes[i].defaultCPU = virXMLPropString(nodes[i], "defaultCPU");
         }
     }
     VIR_FREE(nodes);
@@ -4049,6 +4055,11 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps)
                           qemuCaps->machineTypes[i].maxCpus);
         if (qemuCaps->machineTypes[i].qemuDefault)
             virBufferAddLit(&buf, " default='yes'");
+
+        if (qemuCaps->machineTypes[i].defaultCPU)
+            virBufferEscapeString(&buf, " defaultCPU='%s'",
+                                  qemuCaps->machineTypes[i].defaultCPU);
+
         virBufferAddLit(&buf, "/>\n");
     }
 
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 3bc97b8142..08ce5db2a1 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3515,6 +3515,7 @@ qemuMonitorMachineInfoFree(qemuMonitorMachineInfoPtr machine)
         return;
     VIR_FREE(machine->name);
     VIR_FREE(machine->alias);
+    VIR_FREE(machine->defaultCPU);
     VIR_FREE(machine);
 }
 
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 416bbb1cba..e82c9f2ba4 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1085,6 +1085,7 @@ struct _qemuMonitorMachineInfo {
     char *alias;
     unsigned int maxCpus;
     bool hotplugCpus;
+    char *defaultCPU;
 };
 
 int qemuMonitorGetMachines(qemuMonitorPtr mon,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index c0cd195496..008e9a0600 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -5504,6 +5504,18 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon,
 
         ignore_value(virJSONValueObjectGetBoolean(child, "hotpluggable-cpus",
                                                   &info->hotplugCpus));
+
+        if (virJSONValueObjectHasKey(child, "default-cpu-type")) {
+            if (!(tmp = virJSONValueObjectGetString(child, "default-cpu-type"))) {
+                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                               _("query-machines reply has malformed "
+                                 "'default-cpu-type' data"));
+                goto cleanup;
+            }
+
+            if (VIR_STRDUP(info->defaultCPU, tmp) < 0)
+                goto cleanup;
+        }
     }
 
     ret = n;
diff --git a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml
index d08e4bebde..8e37f27c59 100644
--- a/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_4.2.0.x86_64.xml
@@ -1903,50 +1903,50 @@
   </cpu>
   <cpu type='tcg' name='486-v1' typename='486-v1-x86_64-cpu' usable='yes'/>
   <cpu type='tcg' name='486' typename='486-x86_64-cpu' usable='yes'/>
-  <machine name='pc-i440fx-4.2' alias='pc' hotplugCpus='yes' maxCpus='255' default='yes'/>
-  <machine name='pc-0.15' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-2.12' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-2.0' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-4.2' alias='q35' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-i440fx-2.5' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-1.5' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-0.12' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-2.7' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-2.2' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-1.1' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-2.7' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-2.4' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-2.10' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-i440fx-1.7' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-0.14' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-2.9' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-i440fx-2.11' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-3.1' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-q35-4.1' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-i440fx-2.4' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-1.3' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-4.1' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-2.9' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='isapc' hotplugCpus='yes' maxCpus='1'/>
-  <machine name='pc-i440fx-1.4' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-3.1' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-2.12' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-1.0' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-2.6' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-4.0.1' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-i440fx-1.6' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-0.13' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-2.8' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-i440fx-2.10' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-3.0' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-q35-4.0' hotplugCpus='yes' maxCpus='288'/>
-  <machine name='pc-i440fx-2.3' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-1.2' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-4.0' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-2.8' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-i440fx-3.0' hotplugCpus='yes' maxCpus='255'/>
-  <machine name='pc-q35-2.11' hotplugCpus='yes' maxCpus='288'/>
+  <machine name='pc-i440fx-4.2' alias='pc' hotplugCpus='yes' maxCpus='255' default='yes' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-0.15' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.12' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-4.2' alias='q35' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-1.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-0.12' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-2.7' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.2' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-1.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.7' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-2.4' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-2.10' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-1.7' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-0.14' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-2.9' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.11' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-3.1' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-4.1' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.4' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-1.3' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-4.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.9' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='isapc' hotplugCpus='yes' maxCpus='1' defaultCPU='486-x86_64-cpu'/>
+  <machine name='pc-i440fx-1.4' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-2.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-3.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-2.12' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.1' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-1.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-4.0.1' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-1.6' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-0.13' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-2.8' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.10' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-3.0' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-4.0' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.3' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-1.2' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-4.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-2.8' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-2.5' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-i440fx-3.0' hotplugCpus='yes' maxCpus='255' defaultCPU='qemu64-x86_64-cpu'/>
+  <machine name='pc-q35-2.11' hotplugCpus='yes' maxCpus='288' defaultCPU='qemu64-x86_64-cpu'/>
 </qemuCaps>
-- 
2.23.0




More information about the libvir-list mailing list