[libvirt] [PATCH v3 1/8] qemu_monitor: helper functions for CPU models
Daniel Henrique Barboza
danielhb413 at gmail.com
Wed Jun 26 19:49:57 UTC 2019
On 5/30/19 11:23 AM, Collin Walling wrote:
> Refactor some code in qemuMonitorJSONGetCPUModelExpansion to be
> later used for the comparison and baseline functions.
>
> This does not alter any functionality.
>
> Signed-off-by: Collin Walling <walling at linux.ibm.com>
> Reviewed-by: Bjoern Walk <bwalk at linux.ibm.com>
> ---
Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
> src/qemu/qemu_monitor_json.c | 173 ++++++++++++++++++++++++++++++-------------
> 1 file changed, 121 insertions(+), 52 deletions(-)
>
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 53a7de8..08c734c 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -5503,6 +5503,120 @@ qemuMonitorJSONParseCPUModelProperty(const char *key,
> return 0;
> }
>
> +
> +static virJSONValuePtr
> +qemuMonitorJSONMakeCPUModel(const char *model_name,
> + size_t nprops,
> + virCPUFeatureDefPtr props,
> + bool migratable)
> +{
> + virJSONValuePtr value;
> + virJSONValuePtr feats = NULL;
> + size_t i;
> +
> + if (!(value = virJSONValueNewObject()))
> + goto cleanup;
> +
> + if (virJSONValueObjectAppendString(value, "name", model_name) < 0)
> + goto cleanup;
> +
> + if (nprops || !migratable) {
> + if (!(feats = virJSONValueNewObject()))
> + goto cleanup;
> +
> + for (i = 0; i < nprops; i++) {
> + char *name = props[i].name;
> + bool enabled = false;
> +
> + /* policy may be reported as -1 if the CPU def is a host model */
> + if (props[i].policy == VIR_CPU_FEATURE_REQUIRE ||
> + props[i].policy == VIR_CPU_FEATURE_FORCE ||
> + props[i].policy == -1)
> + enabled = true;
> +
> + if (virJSONValueObjectAppendBoolean(feats, name, enabled) < 0)
> + goto cleanup;
> + }
> +
> + if (!migratable &&
> + virJSONValueObjectAppendBoolean(feats, "migratable", false) < 0) {
> + goto cleanup;
> + }
> +
> + if (virJSONValueObjectAppend(value, "props", feats) < 0)
> + goto cleanup;
> + }
> +
> + return value;
> +
> + cleanup:
> + virJSONValueFree(value);
> + virJSONValueFree(feats);
> + return NULL;
> +}
> +
> +
> +static int
> +qemuMonitorJSONParseCPUModelData(virJSONValuePtr data,
> + virJSONValuePtr *cpu_model,
> + virJSONValuePtr *cpu_props,
> + const char **cpu_name,
> + const char *cmd_name)
> +{
> + if (!(*cpu_model = virJSONValueObjectGetObject(data, "model"))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("%s reply data was missing 'model'"), cmd_name);
> + return -1;
> + }
> +
> + if (!(*cpu_name = virJSONValueObjectGetString(*cpu_model, "name"))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("%s reply data was missing 'name'"), cmd_name);
> + return -1;
> + }
> +
> + /* Some older CPU models do not report properties */
> + *cpu_props = virJSONValueObjectGetObject(*cpu_model, "props");
> +
> + return 0;
> +}
> +
> +
> +static int
> +qemuMonitorJSONParseCPUModel(const char *cpu_name,
> + virJSONValuePtr cpu_props,
> + qemuMonitorCPUModelInfoPtr *model_info)
> +{
> + qemuMonitorCPUModelInfoPtr machine_model = NULL;
> + int ret = -1;
> +
> + if (VIR_ALLOC(machine_model) < 0)
> + goto cleanup;
> +
> + if (VIR_STRDUP(machine_model->name, cpu_name) < 0)
> + goto cleanup;
> +
> + if (cpu_props) {
> + size_t nprops = virJSONValueObjectKeysNumber(cpu_props);
> +
> + 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;
> +
> + cleanup:
> + qemuMonitorCPUModelInfoFree(machine_model);
> + return ret;
> +}
> +
> +
> int
> qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
> qemuMonitorCPUModelExpansionType type,
> @@ -5511,33 +5625,20 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
> qemuMonitorCPUModelInfoPtr *model_info)
> {
> int ret = -1;
> - virJSONValuePtr model = NULL;
> - virJSONValuePtr props = NULL;
> + virJSONValuePtr model;
> virJSONValuePtr cmd = NULL;
> virJSONValuePtr reply = NULL;
> virJSONValuePtr data;
> virJSONValuePtr cpu_model;
> - virJSONValuePtr cpu_props;
> - qemuMonitorCPUModelInfoPtr machine_model = NULL;
> - char const *cpu_name;
> + virJSONValuePtr cpu_props = NULL;
> + const char *cpu_name = "";
> const char *typeStr = "";
>
> *model_info = NULL;
>
> - if (!(model = virJSONValueNewObject()))
> + if (!(model = qemuMonitorJSONMakeCPUModel(model_name, 0, NULL, migratable)))
> goto cleanup;
>
> - if (virJSONValueObjectAppendString(model, "name", model_name) < 0)
> - goto cleanup;
> -
> - if (!migratable) {
> - if (!(props = virJSONValueNewObject()) ||
> - virJSONValueObjectAppendBoolean(props, "migratable", false) < 0 ||
> - virJSONValueObjectAppend(model, "props", props) < 0)
> - goto cleanup;
> - props = NULL;
> - }
> -
> retry:
> switch (type) {
> case QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC:
> @@ -5573,11 +5674,9 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
>
> data = virJSONValueObjectGetObject(reply, "return");
>
> - if (!(cpu_model = virJSONValueObjectGetObject(data, "model"))) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("query-cpu-model-expansion reply data was missing 'model'"));
> + if (qemuMonitorJSONParseCPUModelData(data, &cpu_model, &cpu_props, &cpu_name,
> + "query-cpu-model-expansion") < 0)
> goto cleanup;
> - }
>
> /* QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL requests "full" expansion
> * on the result of the initial "static" expansion.
> @@ -5592,42 +5691,12 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
> goto retry;
> }
>
> - if (!(cpu_name = virJSONValueObjectGetString(cpu_model, "name"))) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("query-cpu-model-expansion reply data was missing 'name'"));
> - goto cleanup;
> - }
> -
> - if (!(cpu_props = virJSONValueObjectGetObject(cpu_model, "props"))) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("query-cpu-model-expansion reply data was missing 'props'"));
> - goto cleanup;
> - }
> -
> - if (VIR_ALLOC(machine_model) < 0)
> - goto cleanup;
> -
> - 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 (virJSONValueObjectForeachKeyValue(cpu_props,
> - qemuMonitorJSONParseCPUModelProperty,
> - machine_model) < 0)
> - goto cleanup;
> -
> - ret = 0;
> - *model_info = machine_model;
> - machine_model = NULL;
> + ret = qemuMonitorJSONParseCPUModel(cpu_name, cpu_props, model_info);
>
> cleanup:
> - qemuMonitorCPUModelInfoFree(machine_model);
> virJSONValueFree(cmd);
> virJSONValueFree(reply);
> virJSONValueFree(model);
> - virJSONValueFree(props);
> return ret;
> }
>
More information about the libvir-list
mailing list