Re: [libvirt] [PATCH v5 05/15] qemu_monitor: allow cpu props to be optional

2019-10-02 Thread Jiri Denemark
On Thu, Sep 19, 2019 at 16:24:56 -0400, Collin Walling wrote:
> 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 
> ---
>  src/qemu/qemu_capabilities.c | 10 --
>  src/qemu/qemu_monitor.c  |  4 +++-
>  src/qemu/qemu_monitor.h  |  1 +
>  src/qemu/qemu_monitor_json.c | 24 
>  src/qemu/qemu_monitor_json.h |  3 ++-
>  tests/cputest.c  |  6 +-
>  6 files changed, 35 insertions(+), 13 deletions(-)

Reviewed-by: Jiri Denemark 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v5 05/15] qemu_monitor: allow cpu props to be optional

2019-09-19 Thread Collin Walling
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 
---
 src/qemu/qemu_capabilities.c | 10 --
 src/qemu/qemu_monitor.c  |  4 +++-
 src/qemu/qemu_monitor.h  |  1 +
 src/qemu/qemu_monitor_json.c | 24 
 src/qemu/qemu_monitor_json.h |  3 ++-
 tests/cputest.c  |  6 +-
 6 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index bc0ac3d..3020530 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2500,6 +2500,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))
@@ -2529,12 +2530,17 @@ virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
 else
 type = QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC;
 
-if (qemuMonitorGetCPUModelExpansion(mon, type, cpu, true, ) < 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,
+) < 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,
 ) < 0)
 goto cleanup;
 
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 7b454c2..6bda620 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3718,6 +3718,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);
@@ -3725,7 +3726,8 @@ qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
 QEMU_CHECK_MONITOR(mon);
 
 return qemuMonitorJSONGetCPUModelExpansion(mon, type, cpu,
-   migratable, model_info);
+   migratable, fail_no_props,
+   model_info);
 }
 
 
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 672b4f9..c9cb3bd 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1159,6 +1159,7 @@ int qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
 qemuMonitorCPUModelExpansionType type,
 virCPUDefPtr cpu,
 bool migratable,
+bool fail_no_props,
 qemuMonitorCPUModelInfoPtr *model_info);
 
 void qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfoPtr model_info);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 77113c0..ddcf425 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -5833,6 +5833,7 @@ qemuMonitorJSONMakeCPUModel(virCPUDefPtr cpu,
 
 static int
 qemuMonitorJSONParseCPUModelData(virJSONValuePtr data,
+ bool fail_no_props,
  virJSONValuePtr *cpu_model,
  virJSONValuePtr *cpu_props,
  const char **cpu_name)
@@ -5849,7 +5850,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;
@@ -5873,13 +5875,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)
-