[libvirt] [PATCH 3/6] qemu: Change/Fix IOThread CPU affinity bitmap manipulation

John Ferlan jferlan at redhat.com
Fri Mar 6 18:47:09 UTC 2015


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 at 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




More information about the libvir-list mailing list