Based on review:
http://www.redhat.com/archives/libvir-list/2015-March/msg00294.html
Adjust how the cpumap and cpumaplen to be returned are generated
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/qemu/qemu_driver.c | 79 +++++++++++++++++---------------------------------
1 file changed, 27 insertions(+), 52 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b37474f..207c62c 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5566,7 +5566,7 @@ qemuDomainGetIOThreadsLive(virQEMUDriverPtr driver,
qemuMonitorIOThreadsInfoPtr *iothreads = NULL;
virDomainIOThreadInfoPtr *info_ret = NULL;
int niothreads = 0;
- int maxcpu, hostcpus, maplen;
+ int hostcpus;
size_t i;
int ret = -1;
@@ -5602,18 +5602,11 @@ qemuDomainGetIOThreadsLive(virQEMUDriverPtr driver,
if ((hostcpus = nodeGetCPUCount()) < 0)
goto endjob;
- maplen = VIR_CPU_MAPLEN(hostcpus);
- maxcpu = maplen * 8;
- if (maxcpu > hostcpus)
- maxcpu = hostcpus;
-
if (VIR_ALLOC_N(info_ret, niothreads) < 0)
goto endjob;
for (i = 0; i < niothreads; i++) {
virBitmapPtr map = NULL;
- unsigned char *tmpmap = NULL;
- int tmpmaplen = 0;
if (VIR_ALLOC(info_ret[i]) < 0)
goto endjob;
@@ -5622,19 +5615,14 @@ qemuDomainGetIOThreadsLive(virQEMUDriverPtr driver,
&info_ret[i]->iothread_id) < 0)
goto endjob;
- if (VIR_ALLOC_N(info_ret[i]->cpumap, maplen) < 0)
+ if (virProcessGetAffinity(iothreads[i]->thread_id, &map, hostcpus) <
0)
goto endjob;
- if (virProcessGetAffinity(iothreads[i]->thread_id, &map, maxcpu) < 0)
+ if (virBitmapToData(map, &info_ret[i]->cpumap,
+ &info_ret[i]->cpumaplen) < 0) {
+ virBitmapFree(map);
goto endjob;
-
- virBitmapToData(map, &tmpmap, &tmpmaplen);
- if (tmpmaplen > maplen)
- tmpmaplen = maplen;
- memcpy(info_ret[i]->cpumap, tmpmap, tmpmaplen);
- info_ret[i]->cpumaplen = tmpmaplen;
-
- VIR_FREE(tmpmap);
+ }
virBitmapFree(map);
}
@@ -5665,12 +5653,8 @@ qemuDomainGetIOThreadsConfig(virDomainDefPtr targetDef,
virDomainIOThreadInfoPtr **info)
{
virDomainIOThreadInfoPtr *info_ret = NULL;
- virDomainVcpuPinDefPtr *iothreadspin_list;
- virBitmapPtr cpumask = NULL;
- unsigned char *cpumap;
- int maxcpu, hostcpus, maplen;
- size_t i, pcpu;
- bool pinned;
+ int hostcpus;
+ size_t i;
int ret = -1;
if (targetDef->iothreads == 0)
@@ -5679,47 +5663,38 @@ qemuDomainGetIOThreadsConfig(virDomainDefPtr targetDef,
if ((hostcpus = nodeGetCPUCount()) < 0)
goto cleanup;
- maplen = VIR_CPU_MAPLEN(hostcpus);
- maxcpu = maplen * 8;
- if (maxcpu > hostcpus)
- maxcpu = hostcpus;
-
if (VIR_ALLOC_N(info_ret, targetDef->iothreads) < 0)
goto cleanup;
for (i = 0; i < targetDef->iothreads; i++) {
+ virDomainVcpuPinDefPtr pininfo;
+ virBitmapPtr bitmap = NULL;
+
if (VIR_ALLOC(info_ret[i]) < 0)
goto cleanup;
/* IOThreads being counting at 1 */
info_ret[i]->iothread_id = i + 1;
- if (VIR_ALLOC_N(info_ret[i]->cpumap, maplen) < 0)
- goto cleanup;
-
/* Initialize the cpumap */
- info_ret[i]->cpumaplen = maplen;
- memset(info_ret[i]->cpumap, 0xff, maplen);
- if (maxcpu % 8)
- info_ret[i]->cpumap[maplen - 1] &= (1 << maxcpu % 8) - 1;
- }
-
- /* If iothreadspin setting exists, there are unused physical cpus */
- iothreadspin_list = targetDef->cputune.iothreadspin;
- for (i = 0; i < targetDef->cputune.niothreadspin; i++) {
- /* vcpuid is the iothread_id...
- * iothread_id is the index into info_ret + 1, so we can
- * assume that the info_ret index we want is vcpuid - 1
- */
- cpumap = info_ret[iothreadspin_list[i]->vcpuid - 1]->cpumap;
- cpumask = iothreadspin_list[i]->cpumask;
-
- for (pcpu = 0; pcpu < maxcpu; pcpu++) {
- if (virBitmapGetBit(cpumask, pcpu, &pinned) < 0)
+ pininfo = virDomainVcpuPinFindByVcpu(targetDef->cputune.iothreadspin,
+ targetDef->cputune.niothreadspin,
+ i + 1);
+ if (!pininfo) {
+ if (!(bitmap = virBitmapNew(hostcpus)))
goto cleanup;
- if (!pinned)
- VIR_UNUSE_CPU(cpumap, pcpu);
+ virBitmapSetAll(bitmap);
+ } else {
+ bitmap = pininfo->cpumask;
+ }
+ if (virBitmapToData(bitmap, &info_ret[i]->cpumap,
+ &info_ret[i]->cpumaplen) < 0) {
+ if (!pininfo)
+ virBitmapFree(bitmap);
+ goto cleanup;
}
+ if (!pininfo)
+ virBitmapFree(bitmap);
}
*info = info_ret;
--
2.1.0