Reuse the approach in qemuDomainGetVcpuPinInfo. --- src/libxl/libxl_driver.c | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index c297d12..9be89f2 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -2305,10 +2305,8 @@ libxlDomainGetVcpuPinInfo(virDomainPtr dom, int ncpumaps, libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm = NULL; virDomainDefPtr targetDef = NULL; - virDomainPinDefPtr *vcpupin_list; - virBitmapPtr cpumask = NULL; - int maxcpu, hostcpus, vcpu, pcpu, n, ret = -1; - unsigned char *cpumap; + int hostcpus, vcpu, ret = -1; + virBitmapPtr allcpumap = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -2336,33 +2334,33 @@ libxlDomainGetVcpuPinInfo(virDomainPtr dom, int ncpumaps, if ((hostcpus = libxl_get_max_cpus(cfg->ctx)) < 0) goto cleanup; - maxcpu = maplen * 8; - if (maxcpu > hostcpus) - maxcpu = hostcpus; + if (!(allcpumap = virBitmapNew(hostcpus))) + goto cleanup; - /* initialize cpumaps */ - memset(cpumaps, 0xff, maplen * ncpumaps); - if (maxcpu % 8) { - for (vcpu = 0; vcpu < ncpumaps; vcpu++) { - cpumap = VIR_GET_CPUMAP(cpumaps, maplen, vcpu); - cpumap[maplen - 1] &= (1 << maxcpu % 8) - 1; - } - } + virBitmapSetAll(allcpumap); - /* if vcpupin setting exists, there may be unused pcpus */ - for (n = 0; n < targetDef->cputune.nvcpupin; n++) { - vcpupin_list = targetDef->cputune.vcpupin; - vcpu = vcpupin_list[n]->id; - cpumask = vcpupin_list[n]->cpumask; - cpumap = VIR_GET_CPUMAP(cpumaps, maplen, vcpu); - for (pcpu = 0; pcpu < maxcpu; pcpu++) { - if (!virBitmapIsBitSet(cpumask, pcpu)) - VIR_UNUSE_CPU(cpumap, pcpu); - } + memset(cpumaps, 0x00, maplen * ncpumaps); + + for (vcpu = 0; vcpu < ncpumaps; vcpu++) { + virDomainPinDefPtr pininfo; + virBitmapPtr bitmap = NULL; + + pininfo = virDomainPinFind(targetDef->cputune.vcpupin, + targetDef->cputune.nvcpupin, + vcpu); + + if (pininfo && pininfo->cpumask) + bitmap = pininfo->cpumask; + else + bitmap = allcpumap; + + virBitmapToDataBuf(bitmap, VIR_GET_CPUMAP(cpumaps, maplen, vcpu), maplen); } + ret = ncpumaps; cleanup: + virBitmapFree(allcpumap); if (vm) virObjectUnlock(vm); virObjectUnref(cfg); -- 2.4.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list