]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_monitor: allow cpu props to be optional
authorCollin Walling <walling@linux.ibm.com>
Thu, 19 Sep 2019 20:24:56 +0000 (16:24 -0400)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 7 Oct 2019 08:09:49 +0000 (10:09 +0200)
Some older s390 CPU models (e.g. z900) will not report props as a
response from query-cpu-model-expansion. As such, we should make the
props field optional when parsing the return data from the QMP response.

Signed-off-by: Collin Walling <walling@linux.ibm.com>
Message-Id: <1568924706-2311-6-git-send-email-walling@linux.ibm.com>
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h
tests/cputest.c

index c59fe7e92b2a49db9533f67fcd6defced980aa50..4fc81fbd2ac6c89913353ee180467623bd4b06ab 100644 (file)
@@ -2506,6 +2506,7 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
     virCPUDefPtr cpu;
     qemuMonitorCPUModelExpansionType type;
     virDomainVirtType virtType;
+    bool fail_no_props = true;
     int ret = -1;
 
     if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
@@ -2535,12 +2536,17 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
     else
         type = QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC;
 
-    if (qemuMonitorGetCPUModelExpansion(mon, type, cpu, true, &modelInfo) < 0)
+    /* Older s390 models do not report a feature set */
+    if (ARCH_IS_S390(qemuCaps->arch))
+        fail_no_props = false;
+
+    if (qemuMonitorGetCPUModelExpansion(mon, type, cpu, true, fail_no_props,
+                                        &modelInfo) < 0)
         goto cleanup;
 
     /* Try to check migratability of each feature. */
     if (modelInfo &&
-        qemuMonitorGetCPUModelExpansion(mon, type, cpu, false,
+        qemuMonitorGetCPUModelExpansion(mon, type, cpu, false, fail_no_props,
                                         &nonMigratable) < 0)
         goto cleanup;
 
index c05d935504e1f75422978bba3cd55f044a38fa7b..f841fb32a6820ae506dd528db9f83d239d987197 100644 (file)
@@ -3548,6 +3548,7 @@ qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
                                 qemuMonitorCPUModelExpansionType type,
                                 virCPUDefPtr cpu,
                                 bool migratable,
+                                bool fail_no_props,
                                 qemuMonitorCPUModelInfoPtr *model_info)
 {
     VIR_DEBUG("type=%d cpu=%p migratable=%d", type, cpu, migratable);
@@ -3555,7 +3556,8 @@ qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
     QEMU_CHECK_MONITOR(mon);
 
     return qemuMonitorJSONGetCPUModelExpansion(mon, type, cpu,
-                                               migratable, model_info);
+                                               migratable, fail_no_props,
+                                               model_info);
 }
 
 
index 13d85ee8e990232880cca8a094414fc4b2bf88ce..1d72ac40da24768fec47e1fff1c38478f8e69161 100644 (file)
@@ -1148,6 +1148,7 @@ int qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
                                     qemuMonitorCPUModelExpansionType type,
                                     virCPUDefPtr cpu,
                                     bool migratable,
+                                    bool fail_no_props,
                                     qemuMonitorCPUModelInfoPtr *model_info);
 
 void qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfoPtr model_info);
index 3850c6c55be33bffbdc8b9f0ff17025df873b56e..fb44df9f8d1c7b2f84564a7f140c04a7c077fc4d 100644 (file)
@@ -5736,6 +5736,7 @@ qemuMonitorJSONMakeCPUModel(virCPUDefPtr cpu,
 
 static int
 qemuMonitorJSONParseCPUModelData(virJSONValuePtr data,
+                                 bool fail_no_props,
                                  virJSONValuePtr *cpu_model,
                                  virJSONValuePtr *cpu_props,
                                  const char **cpu_name)
@@ -5752,7 +5753,8 @@ qemuMonitorJSONParseCPUModelData(virJSONValuePtr data,
         return -1;
     }
 
-    if (!(*cpu_props = virJSONValueObjectGetObject(*cpu_model, "props"))) {
+    if (!(*cpu_props = virJSONValueObjectGetObject(*cpu_model, "props")) &&
+        fail_no_props) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("query-cpu-model-expansion reply data was missing 'props'"));
         return -1;
@@ -5776,13 +5778,17 @@ qemuMonitorJSONParseCPUModel(const char *cpu_name,
     if (VIR_STRDUP(machine_model->name, cpu_name) < 0)
         goto cleanup;
 
-    if (VIR_ALLOC_N(machine_model->props, virJSONValueObjectKeysNumber(cpu_props)) < 0)
-        goto cleanup;
+    if (cpu_props) {
+        size_t nprops = virJSONValueObjectKeysNumber(cpu_props);
 
-    if (virJSONValueObjectForeachKeyValue(cpu_props,
-                                          qemuMonitorJSONParseCPUModelProperty,
-                                          machine_model) < 0)
-        goto cleanup;
+        if (VIR_ALLOC_N(machine_model->props, nprops) < 0)
+            goto cleanup;
+
+        if (virJSONValueObjectForeachKeyValue(cpu_props,
+                                              qemuMonitorJSONParseCPUModelProperty,
+                                              machine_model) < 0)
+            goto cleanup;
+    }
 
     VIR_STEAL_PTR(*model_info, machine_model);
     ret = 0;
@@ -5798,6 +5804,7 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
                                     qemuMonitorCPUModelExpansionType type,
                                     virCPUDefPtr cpu,
                                     bool migratable,
+                                    bool fail_no_props,
                                     qemuMonitorCPUModelInfoPtr *model_info)
 {
     VIR_AUTOPTR(virJSONValue) model = NULL;
@@ -5848,7 +5855,8 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
     data = virJSONValueObjectGetObject(reply, "return");
 
     if (qemuMonitorJSONParseCPUModelData(data,
-                                         &cpu_model, &cpu_props, &cpu_name) < 0)
+                                         fail_no_props, &cpu_model, &cpu_props,
+                                         &cpu_name) < 0)
         return -1;
 
     /* QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL requests "full" expansion
index 6e6da9d456b60d62d7bdd0863e7440d1368196c2..569fb656f09a6f41b02b004c525f174e7493fa38 100644 (file)
@@ -383,8 +383,9 @@ int qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
                                         qemuMonitorCPUModelExpansionType type,
                                         virCPUDefPtr cpu,
                                         bool migratable,
+                                        bool fail_no_props,
                                         qemuMonitorCPUModelInfoPtr *model_info)
-    ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(5);
+    ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(6);
 
 int qemuMonitorJSONGetCommands(qemuMonitorPtr mon,
                                char ***commands)
index 3c17ed4a16fc487da9d8a56dc003c50dc39b0e51..e3937c6fd627da1364ce46df9f91f34faf6445a7 100644 (file)
@@ -482,6 +482,7 @@ cpuTestMakeQEMUCaps(const struct data *data)
     qemuMonitorTestPtr testMon = NULL;
     qemuMonitorCPUModelInfoPtr model = NULL;
     virCPUDefPtr cpu = NULL;
+    bool fail_no_props = true;
     char *json = NULL;
 
     if (virAsprintf(&json, "%s/cputestdata/%s-cpuid-%s.json",
@@ -494,9 +495,12 @@ cpuTestMakeQEMUCaps(const struct data *data)
     if (VIR_ALLOC(cpu) < 0 || VIR_STRDUP(cpu->model, "host") < 0)
         goto cleanup;
 
+    if (ARCH_IS_S390(data->arch))
+        fail_no_props = false;
+
     if (qemuMonitorGetCPUModelExpansion(qemuMonitorTestGetMonitor(testMon),
                                         QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC,
-                                        cpu, true, &model) < 0)
+                                        cpu, true, fail_no_props, &model) < 0)
         goto error;
 
     if (!(qemuCaps = virQEMUCapsNew()))