[libvirt] [PATCH 33/34] qemu: driver: Refactor qemuDomainHelperGetVcpus

John Ferlan jferlan at redhat.com
Tue Nov 24 12:56:19 UTC 2015



On 11/20/2015 10:22 AM, Peter Krempa wrote:
> Change some of the control structures and switch to using the new vcpu
> structure.
> ---
>  src/qemu/qemu_driver.c | 77 ++++++++++++++++++++++++++++----------------------
>  1 file changed, 43 insertions(+), 34 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index c659328..b9f8e72 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1422,11 +1422,17 @@ qemuGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
> 
> 
>  static int
> -qemuDomainHelperGetVcpus(virDomainObjPtr vm, virVcpuInfoPtr info, int maxinfo,
> -                         unsigned char *cpumaps, int maplen)
> +qemuDomainHelperGetVcpus(virDomainObjPtr vm,
> +                         virVcpuInfoPtr info,
> +                         int maxinfo,
> +                         unsigned char *cpumaps,
> +                         int maplen)
>  {
> -    size_t i, v;
> -    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    size_t ncpuinfo = 0;
> +    size_t i;
> +
> +    if (maxinfo == 0)
> +        return 0;
> 
>      if (!qemuDomainHasVCpuPids(vm)) {
>          virReportError(VIR_ERR_OPERATION_INVALID,
> @@ -1434,43 +1440,46 @@ qemuDomainHelperGetVcpus(virDomainObjPtr vm, virVcpuInfoPtr info, int maxinfo,
>          return -1;
>      }
> 
> -    /* Clamp to actual number of vcpus */
> -    if (maxinfo > priv->nvcpupids)
> -        maxinfo = priv->nvcpupids;
> -
> -    if (maxinfo >= 1) {
> -        if (info != NULL) {
> -            memset(info, 0, sizeof(*info) * maxinfo);
> -            for (i = 0; i < maxinfo; i++) {
> -                info[i].number = i;
> -                info[i].state = VIR_VCPU_RUNNING;
> -
> -                if (qemuGetProcessInfo(&(info[i].cpuTime),
> -                                       &(info[i].cpu),
> -                                       NULL,
> -                                       vm->pid,
> -                                       qemuDomainGetVCpuPid(vm, i)) < 0) {
> -                    virReportSystemError(errno, "%s",
> -                                         _("cannot get vCPU placement & pCPU time"));
> -                    return -1;
> -                }
> +    if (info)
> +        memset(info, 0, sizeof(*info) * maxinfo);
> +
> +    if (cpumaps)
> +        memset(cpumaps, 0, sizeof(*cpumaps) * maxinfo);
> +
> +    for (i = 0; i < virDomainDefGetVCpusMax(vm->def) && ncpuinfo < maxinfo; i++) {

This line is longer than 80 cols.

> +        virDomainVCpuInfoPtr vcpu = virDomainDefGetVCpu(vm->def, i);
> +        pid_t vcpupid = qemuDomainGetVCpuPid(vm, i);
> +
> +        if (!vcpu->online)
> +            continue;

So if the goal is to eventually allow vcpu 0 & 2 of 4 vcpu's to be
online, then this algorithm will need a slight adjustment.

Of course there's also the what if 'vcpupid == 0' that hasn't been
checked here (comments from patch 32).

I "believe" what needs to be done is change the [i] below to [ncpuinfo]
- that way the info & cpumaps would be returned with only the
ONLINE/RUNNING vCPU's and 'info[]' won't have gaps which won't be
accessible if a "2" is returned...  I think the same holds true for the
VIR_GET_CPUMAP


ACK with some adjustments.

John

> +
> +        if (info) {
> +            info[i].number = i;
> +            info[i].state = VIR_VCPU_RUNNING;
> +
> +            if (qemuGetProcessInfo(&(info[i].cpuTime), &(info[i].cpu), NULL,
> +                                   vm->pid, vcpupid) < 0) {
> +                virReportSystemError(errno, "%s",
> +                                     _("cannot get vCPU placement & pCPU time"));
> +                return -1;
>              }
>          }
> 
> -        if (cpumaps != NULL) {
> -            for (v = 0; v < maxinfo; v++) {
> -                unsigned char *cpumap = VIR_GET_CPUMAP(cpumaps, maplen, v);
> -                virBitmapPtr map = NULL;
> +        if (cpumaps) {
> +            unsigned char *cpumap = VIR_GET_CPUMAP(cpumaps, maplen, i);
> +            virBitmapPtr map = NULL;
> 
> -                if (!(map = virProcessGetAffinity(qemuDomainGetVCpuPid(vm, v))))
> -                    return -1;
> +            if (!(map = virProcessGetAffinity(vcpupid)))
> +                return -1;
> 
> -                virBitmapToDataBuf(map, cpumap, maplen);
> -                virBitmapFree(map);
> -            }
> +            virBitmapToDataBuf(map, cpumap, maplen);
> +            virBitmapFree(map);
>          }
> +
> +        ncpuinfo++;
>      }
> -    return maxinfo;
> +
> +    return ncpuinfo;
>  }
> 
> 




More information about the libvir-list mailing list