[libvirt] [PATCH v2 03/11] qemu: qmp query-cpu-model-expansion command

Jiri Denemark jdenemar at redhat.com
Thu Dec 15 11:47:27 UTC 2016


On Fri, Dec 09, 2016 at 14:38:32 -0500, Jason J. Herne wrote:
> From: "Collin L. Walling" <walling at linux.vnet.ibm.com>
> 
> 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 at linux.vnet.ibm.com>
> Signed-off-by: Jason J. Herne <jjherne at linux.vnet.ibm.com>
> ---
>  src/qemu/qemu_monitor.c      |  62 ++++++++++++++++++++++
>  src/qemu/qemu_monitor.h      |  22 ++++++++
>  src/qemu/qemu_monitor_json.c | 121 +++++++++++++++++++++++++++++++++++++++++++
>  src/qemu/qemu_monitor_json.h |  12 +++++
>  4 files changed, 217 insertions(+)
> 
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 648168d..1a9665f 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -3660,6 +3660,68 @@ qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu)
...
> +qemuMonitorCPUModelInfoPtr
> +qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig)
> +{
> +    qemuMonitorCPUModelInfoPtr copy;
> +    size_t i;
> +
> +    if (VIR_ALLOC(copy) < 0)
> +        goto cleanup;
> +
> +    if (VIR_ALLOC_N(copy->props, orig->nprops) < 0)
> +        goto cleanup;
> +
> +    if (VIR_STRDUP(copy->name, orig->name) < 0)
> +        goto cleanup;
> +
> +    copy->nprops = orig->nprops;
> +
> +    for (i = 0; i < orig->nprops; i++) {
> +        if (VIR_STRDUP(copy->props[i].name, orig->props[i].name) < 0)
> +            goto cleanup;
> +
> +        copy->props[i].supported = orig->props[i].supported;
> +    }
> +
> +    return copy;
> +
> + cleanup:

"error" would be a better name for this label since it is never used in
a success path.

> +    qemuMonitorCPUModelInfoFree(copy);
> +    return NULL;
> +}
> +
> +
> +int
>  qemuMonitorGetCommands(qemuMonitorPtr mon,
>                         char ***commands)
>  {
...
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 0c38b8f..9189a8b 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -4973,6 +4973,127 @@ qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
>      return ret;
>  }
>  
> +int
> +qemuMonitorJSONParseCPUModelProperty(const char *key,
> +                                     const virJSONValue *value,
> +                                     void *opaque)
> +{
> +    qemuMonitorCPUModelInfoPtr machine_model = opaque;
> +    size_t n = machine_model->nprops;
> +    bool supported;
> +
> +    if (!key) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("query-cpu-model-expansion reply data is missing a"
> +                         " property name"));
> +        return -1;
> +    }
> +    if (VIR_STRDUP(machine_model->props[n].name, key) < 0)
> +        return -1;
> +
> +    if (virJSONValueGetBoolean(virJSONValueCopy(value), &supported) < 0) {

Ouch, calling virJSONValueCopy() would just leak memory here. If we drop
the "const" requirement from virJSONValueObjectForeachKeyValue (pushed
yesterday as v2.5.0-96-gc1cb4cb9f) we can directly pass value.

> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("query-cpu-model-expansion reply data is missing a"
> +                         " feature support value"));
> +        return -1;
> +    }
> +    machine_model->props[n].supported = supported;
> +
> +    machine_model->nprops++;
> +    return 0;
> +}
> +
> +int
> +qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
> +                                    const char *type,
> +                                    const char *model_name,
> +                                    qemuMonitorCPUModelInfoPtr *model_info)
> +{
...
> +    if (qemuMonitorJSONCheckError(cmd, reply) < 0)
> +        goto cleanup;
> +
> +    if (!(data = virJSONValueObjectGetObject(reply, "return"))) {

data can never be NULL here because qemuMonitorJSONCheckError() returned
success.

> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("query-cpu-model-expansion reply data was missing return"));
> +        goto cleanup;
> +    }
...
> diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
> index adff0c3..10e4955 100644
> --- a/src/qemu/qemu_monitor_json.h
> +++ b/src/qemu/qemu_monitor_json.h
> @@ -352,6 +352,18 @@ int qemuMonitorJSONGetCPUDefinitions(qemuMonitorPtr mon,
>                                       qemuMonitorCPUDefInfoPtr **cpus)
>      ATTRIBUTE_NONNULL(2);
>  
> +int
> +qemuMonitorJSONParseCPUModelProperty(const char *key,
> +                                     const virJSONValue *value,
> +                                     void *opaque)
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);

There's no reason for exporting this function outside
qemu_monitor_json.c

> +
> +int qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
> +                                        const char *type,
> +                                        const char *model_name,
> +                                        qemuMonitorCPUModelInfoPtr *model_info)
> +    ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
> +
>  int qemuMonitorJSONGetCommands(qemuMonitorPtr mon,
>                                 char ***commands)
>      ATTRIBUTE_NONNULL(2);

ACK with the suggested changes

Jirka




More information about the libvir-list mailing list