[libvirt] [PATCH 4/4] Implement QMP support for extracting CPU thread ID

Daniel Veillard veillard at redhat.com
Mon Jan 25 14:34:42 UTC 2010


On Fri, Jan 22, 2010 at 05:01:14PM +0000, Daniel P. Berrange wrote:
> The KVM build of QEMU includs the thread ID of each vCPU in the
> 'query-cpus' output. This is required for pinning guests to
> particular host CPUs
> 
> * src/qemu/qemu_monitor_json.c: Extract 'thread_id' from CPU info
> ---
>  src/qemu/qemu_monitor_json.c |   82 +++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 81 insertions(+), 1 deletions(-)
> 
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 7dd2bdb..8e88c7e 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -536,6 +536,85 @@ int qemuMonitorJSONSystemPowerdown(qemuMonitorPtr mon)
>  }
>  
>  
> +/*
> + * [ { "CPU": 0, "current": true, "halted": false, "pc": 3227107138 },
> + *   { "CPU": 1, "current": false, "halted": true, "pc": 7108165 } ]
> + */
> +static int
> +qemuMonitorJSONExtractCPUInfo(virJSONValuePtr reply,
> +                              int **pids)
> +{
> +    virJSONValuePtr data;
> +    int ret = -1;
> +    int i;
> +    int *threads = NULL;
> +    int ncpus;
> +
> +    if (!(data = virJSONValueObjectGet(reply, "return"))) {
> +        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> +                         _("cpu reply was missing return data"));
> +        goto cleanup;
> +    }
> +
> +    if (data->type != VIR_JSON_TYPE_ARRAY) {
> +        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> +                         _("cpu information was not an array"));
> +        goto cleanup;
> +    }
> +
> +    if ((ncpus = virJSONValueArraySize(data)) <= 0) {
> +        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> +                         _("cpu information was empty"));
> +        goto cleanup;
> +    }
> +
> +    if (VIR_REALLOC_N(threads, ncpus) < 0) {
> +        virReportOOMError(NULL);
> +        goto cleanup;
> +    }
> +
> +    for (i = 0 ; i < ncpus ; i++) {
> +        virJSONValuePtr entry = virJSONValueArrayGet(data, i);
> +        int cpu;
> +        int thread;
> +        if (!entry) {
> +            qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> +                             _("character device information was missing aray element"));
> +            goto cleanup;
> +        }
> +
> +        if (virJSONValueObjectGetNumberInt(entry, "CPU", &cpu) < 0) {
> +            qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> +                             _("cpu information was missing cpu number"));
> +            goto cleanup;
> +        }
> +
> +        if (virJSONValueObjectGetNumberInt(entry, "thread_id", &thread) < 0) {
> +            qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
> +                             _("cpu information was missing thread ID"));
> +            goto cleanup;
> +        }
> +
> +        if (cpu != i) {
> +            qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
> +                             _("unexpected cpu index %d expecting %d"),
> +                             i, cpu);
> +            goto cleanup;
> +        }
> +
> +        threads[i] = thread;
> +    }
> +
> +    *pids = threads;
> +    threads = NULL;
> +    ret = 0;
> +
> +cleanup:
> +    VIR_FREE(threads);
> +    return ret;
> +}
> +
> +
>  int qemuMonitorJSONGetCPUInfo(qemuMonitorPtr mon,
>                                int **pids)
>  {
> @@ -554,7 +633,8 @@ int qemuMonitorJSONGetCPUInfo(qemuMonitorPtr mon,
>      if (ret == 0)
>          ret = qemuMonitorJSONCheckError(cmd, reply);
>  
> -    /* XXX extract PIDs if present - QEMU hasn't implement this yet :-( */
> +    if (ret == 0)
> +        ret = qemuMonitorJSONExtractCPUInfo(reply, pids);
>  
>      virJSONValueFree(cmd);
>      virJSONValueFree(reply);

  ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list