virCPUDefPtr cpu;
qemuMonitorCPUModelExpansionType type;
virDomainVirtType virtType;
+ bool fail_no_props = true;
int ret = -1;
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
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;
qemuMonitorCPUModelExpansionType type,
virCPUDefPtr cpu,
bool migratable,
+ bool fail_no_props,
qemuMonitorCPUModelInfoPtr *model_info)
{
VIR_DEBUG("type=%d cpu=%p migratable=%d", type, cpu, migratable);
QEMU_CHECK_MONITOR(mon);
return qemuMonitorJSONGetCPUModelExpansion(mon, type, cpu,
- migratable, model_info);
+ migratable, fail_no_props,
+ model_info);
}
qemuMonitorCPUModelExpansionType type,
virCPUDefPtr cpu,
bool migratable,
+ bool fail_no_props,
qemuMonitorCPUModelInfoPtr *model_info);
void qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfoPtr model_info);
static int
qemuMonitorJSONParseCPUModelData(virJSONValuePtr data,
+ bool fail_no_props,
virJSONValuePtr *cpu_model,
virJSONValuePtr *cpu_props,
const char **cpu_name)
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;
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;
qemuMonitorCPUModelExpansionType type,
virCPUDefPtr cpu,
bool migratable,
+ bool fail_no_props,
qemuMonitorCPUModelInfoPtr *model_info)
{
VIR_AUTOPTR(virJSONValue) model = NULL;
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
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)
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",
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()))