On Mon, Nov 21, 2016 at 14:11:53 -0500, Jason J. Herne wrote: > From: "Collin L. Walling" <walling@xxxxxxxxxxxxxxxxxx> > > query-cpu-model-expansion is used to get a list of features for a given cpu > model name or to get the model and features of the host hardware/environment > as seen by Qemu/kvm. > > Signed-off-by: Collin L. Walling <walling@xxxxxxxxxxxxxxxxxx> > Signed-off-by: Jason J. Herne <jjherne@xxxxxxxxxxxxxxxxxx> > --- > src/qemu/qemu_monitor.c | 60 ++++++++++++++++++++++++++++ > src/qemu/qemu_monitor.h | 22 +++++++++++ > src/qemu/qemu_monitor_json.c | 94 ++++++++++++++++++++++++++++++++++++++++++++ > src/qemu/qemu_monitor_json.h | 6 +++ > 4 files changed, 182 insertions(+) > > diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c > index 0bfc1a8..927ef39 100644 > --- a/src/qemu/qemu_monitor.c > +++ b/src/qemu/qemu_monitor.c > @@ -3615,6 +3615,66 @@ qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu) > > > int > +qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon, > + const char *type, > + const char *model_name, > + qemuMonitorCPUModelInfoPtr *model_info) > +{ > + VIR_DEBUG("model_info=%p", model_info); Printing type and model_name would be even more interesting than model_info pointer. > + > + QEMU_CHECK_MONITOR_JSON(mon); > + > + return qemuMonitorJSONGetCPUModelExpansion(mon, type, model_name, model_info); > +} > + > + > +void > +qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfoPtr model_info) > +{ > + size_t i; > + > + if (!model_info) > + return; > + VIR_FREE(model_info->name); > + for (i = 0; i < model_info->nprops; i++) > + VIR_FREE(model_info->props[i].name); > + VIR_FREE(model_info); I think this code would be slightly nicer in the following form: if (!model_info) return; for (i = 0; i < model_info->nprops; i++) VIR_FREE(model_info->props[i].name); VIR_FREE(model_info->name); VIR_FREE(model_info); > +} ... > diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c > index ef8672c..af50997 100644 > --- a/src/qemu/qemu_monitor_json.c > +++ b/src/qemu/qemu_monitor_json.c > @@ -4930,6 +4930,100 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon, > return ret; > } > > +int > +qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon, > + const char *type, > + const char *model_name, > + qemuMonitorCPUModelInfoPtr *model_info) > +{ > + int ret = -1; > + virJSONValuePtr model; > + virJSONValuePtr cmd = NULL; > + virJSONValuePtr reply = NULL; > + virJSONValuePtr data; > + virJSONValuePtr cpu_model; > + virJSONValuePtr cpu_props; > + qemuMonitorCPUModelInfoPtr newmodel = NULL; Hmm, would you mind s/newmodel/cpu/ or something similar? I found the "newmodel" name to be quite confusing. > + char const *cpu_name; > + int n; I think the "n" variable is not really necessary. > + size_t i; > + > + *model_info = NULL; > + > + if (!(model = virJSONValueNewObject())) > + goto cleanup; > + > + if (virJSONValueObjectAppendString(model, "name", model_name) < 0) > + goto cleanup; > + > + if (!(cmd = qemuMonitorJSONMakeCommand("query-cpu-model-expansion", > + "s:type", type, > + "a:model", model, > + NULL))) > + goto cleanup; > + > + if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) > + goto cleanup; > + > + if (qemuMonitorJSONCheckError(cmd, reply) < 0) > + goto cleanup; > + > + if (!(data = virJSONValueObjectGetObject(reply, "return"))) { > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("query-cpu-model-expansion reply was missing return data")); > + goto cleanup; > + } Just drop this condition, "return" object is guaranteed to exist if qemuMonitorJSONCheckError() returns zero. It's perfectly OK to do data = virJSONValueObjectGetObject(reply, "return"); if (!(cpu_model = virJSONValueObjectGetObject(data, "model"))) ... > + > + if (!(cpu_model = virJSONValueObjectGetObject(data, "model"))) An error message should be reported here. > + goto cleanup; > + > + if (!(cpu_name = virJSONValueObjectGetString(cpu_model, "name"))) And here. > + goto cleanup; > + > + if (!(cpu_props = virJSONValueObjectGetObject(cpu_model, "props"))) I believe this should be if (!(cpu_props = virJSONValueObjectGetArray(cpu_model, "props"))) and an error should be reported here. > + goto cleanup; > + > + if (VIR_ALLOC(newmodel) < 0) > + goto cleanup; > + > + if (VIR_STRDUP(newmodel->name, cpu_name) < 0) > + goto cleanup; > + > + n = newmodel->nprops = cpu_props->data.object.npairs; newmodel->nprops = virJSONValueArraySize(cpu_props) > + > + if (VIR_ALLOC_N(newmodel->props, n) < 0) > + goto cleanup; > + > + for (i = 0; i < n; i++) { > + const char *prop_name; > + bool supported; > + > + if (!(prop_name = virJSONValueObjectGetKey(cpu_props, i))) { > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("query-cpu-model-expansion reply data is missing a" > + " property name")); > + goto cleanup; > + } > + if (VIR_STRDUP(newmodel->props[i].name, prop_name) < 0) > + goto cleanup; > + > + if (virJSONValueObjectGetBoolean(cpu_props, prop_name, &supported) < 0) An error should be reported here. > + goto cleanup; > + newmodel->props[i].supported = supported; > + } > + > + ret = 0; > + *model_info = newmodel; > + newmodel = NULL; > + > + cleanup: > + qemuMonitorCPUModelInfoFree(newmodel); > + virJSONValueFree(cmd); > + virJSONValueFree(reply); > + virJSONValueFree(model); > + return ret; > +} > + > > int qemuMonitorJSONGetCommands(qemuMonitorPtr mon, > char ***commands) ... Jirka -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list