]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Use virBitmapToDataBuf in qemuDomainGetVcpuPinInfo
authorPeter Krempa <pkrempa@redhat.com>
Fri, 22 May 2015 09:07:21 +0000 (11:07 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 3 Jun 2015 07:42:07 +0000 (09:42 +0200)
Reuse the function so that we can get rid of a lot of temporary
allocations.

src/qemu/qemu_driver.c

index e34cb6c2ff80bbeb43e82d68d02d4553982cf554..f6107b778489f77b670e6278947c0ff626ed438b 100644 (file)
@@ -5291,8 +5291,8 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom,
     virDomainDefPtr targetDef = NULL;
     int ret = -1;
     int hostcpus, vcpu;
-    unsigned char *cpumap;
     virCapsPtr caps = NULL;
+    virBitmapPtr allcpumap = NULL;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -5319,6 +5319,11 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom,
     if ((hostcpus = nodeGetCPUCount()) < 0)
         goto cleanup;
 
+    if (!(allcpumap = virBitmapNew(hostcpus)))
+        goto cleanup;
+
+    virBitmapSetAll(allcpumap);
+
     /* Clamp to actual number of vcpus */
     if (ncpumaps > targetDef->vcpus)
         ncpumaps = targetDef->vcpus;
@@ -5329,37 +5334,23 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom,
     for (vcpu = 0; vcpu < ncpumaps; vcpu++) {
         virDomainPinDefPtr pininfo;
         virBitmapPtr bitmap = NULL;
-        unsigned char *tmpmap = NULL;
-        int tmpmaplen;
 
         pininfo = virDomainPinFind(targetDef->cputune.vcpupin,
                                    targetDef->cputune.nvcpupin,
                                    vcpu);
-        if (!pininfo) {
-            if (!(bitmap = virBitmapNew(hostcpus)))
-                goto cleanup;
-            virBitmapSetAll(bitmap);
-        } else {
+
+        if (pininfo && pininfo->cpumask)
             bitmap = pininfo->cpumask;
-        }
+        else
+            bitmap = allcpumap;
 
-        if (virBitmapToData(bitmap, &tmpmap, &tmpmaplen) < 0) {
-            if (!pininfo)
-                virBitmapFree(bitmap);
-            goto cleanup;
-        }
-        if (tmpmaplen > maplen)
-            tmpmaplen = maplen;
-        cpumap = VIR_GET_CPUMAP(cpumaps, maplen, vcpu);
-        memcpy(cpumap, tmpmap, tmpmaplen);
-        if (!pininfo)
-            virBitmapFree(bitmap);
-        VIR_FREE(tmpmap);
+        virBitmapToDataBuf(bitmap, VIR_GET_CPUMAP(cpumaps, maplen, vcpu), maplen);
     }
 
     ret = ncpumaps;
 
  cleanup:
+    virBitmapFree(allcpumap);
     virDomainObjEndAPI(&vm);
     virObjectUnref(caps);
     return ret;