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; > } > > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list