[libvirt] [PATCH] qemu: do upfront check for vcpupids being null when querying pinning

Serge Hallyn serge.hallyn at ubuntu.com
Tue Feb 10 17:33:51 UTC 2015


Quoting Daniel P. Berrange (berrange at redhat.com):
> The qemuDomainHelperGetVcpus attempted to report an error when the
> vcpupids info was NULL. Unfortunately earlier code would clamp the
> value of 'maxinfo' to 0 when nvcpupids was 0, so the error reporting
> would end up being skipped.
> 
> This lead to 'virsh vcpuinfo <dom>' just returning an empty list
> instead of giving the user a clear error.
> ---

Cool, thanks.  (haven't kicked off a test yet but it looks correct :)

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

>  src/qemu/qemu_driver.c | 47 +++++++++++++++++++++++------------------------
>  1 file changed, 23 insertions(+), 24 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index e3ca437..cd30d9a 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1376,6 +1376,12 @@ qemuDomainHelperGetVcpus(virDomainObjPtr vm, virVcpuInfoPtr info, int maxinfo,
>      if ((hostcpus = nodeGetCPUCount()) < 0)
>          return -1;
>  
> +    if (priv->vcpupids == NULL) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "%s", _("cpu affinity is not supported"));
> +        return -1;
> +    }
> +
>      maxcpu = maplen * 8;
>      if (maxcpu > hostcpus)
>          maxcpu = hostcpus;
> @@ -1391,8 +1397,7 @@ qemuDomainHelperGetVcpus(virDomainObjPtr vm, virVcpuInfoPtr info, int maxinfo,
>                  info[i].number = i;
>                  info[i].state = VIR_VCPU_RUNNING;
>  
> -                if (priv->vcpupids != NULL &&
> -                    qemuGetProcessInfo(&(info[i].cpuTime),
> +                if (qemuGetProcessInfo(&(info[i].cpuTime),
>                                         &(info[i].cpu),
>                                         NULL,
>                                         vm->pid,
> @@ -1406,28 +1411,22 @@ qemuDomainHelperGetVcpus(virDomainObjPtr vm, virVcpuInfoPtr info, int maxinfo,
>  
>          if (cpumaps != NULL) {
>              memset(cpumaps, 0, maplen * maxinfo);
> -            if (priv->vcpupids != NULL) {
> -                for (v = 0; v < maxinfo; v++) {
> -                    unsigned char *cpumap = VIR_GET_CPUMAP(cpumaps, maplen, v);
> -                    virBitmapPtr map = NULL;
> -                    unsigned char *tmpmap = NULL;
> -                    int tmpmapLen = 0;
> -
> -                    if (virProcessGetAffinity(priv->vcpupids[v],
> -                                              &map, maxcpu) < 0)
> -                        return -1;
> -                    virBitmapToData(map, &tmpmap, &tmpmapLen);
> -                    if (tmpmapLen > maplen)
> -                        tmpmapLen = maplen;
> -                    memcpy(cpumap, tmpmap, tmpmapLen);
> -
> -                    VIR_FREE(tmpmap);
> -                    virBitmapFree(map);
> -                }
> -            } else {
> -                virReportError(VIR_ERR_OPERATION_INVALID,
> -                               "%s", _("cpu affinity is not available"));
> -                return -1;
> +            for (v = 0; v < maxinfo; v++) {
> +                unsigned char *cpumap = VIR_GET_CPUMAP(cpumaps, maplen, v);
> +                virBitmapPtr map = NULL;
> +                unsigned char *tmpmap = NULL;
> +                int tmpmapLen = 0;
> +
> +                if (virProcessGetAffinity(priv->vcpupids[v],
> +                                          &map, maxcpu) < 0)
> +                    return -1;
> +                virBitmapToData(map, &tmpmap, &tmpmapLen);
> +                if (tmpmapLen > maplen)
> +                    tmpmapLen = maplen;
> +                memcpy(cpumap, tmpmap, tmpmapLen);
> +
> +                VIR_FREE(tmpmap);
> +                virBitmapFree(map);
>              }
>          }
>      }
> -- 
> 2.1.0
> 




More information about the libvir-list mailing list