[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