]> xenbits.xensource.com Git - libvirt.git/commitdiff
use virBitmap to store cpumask info.
authorHu Tao <hutao@cn.fujitsu.com>
Fri, 14 Sep 2012 07:47:01 +0000 (15:47 +0800)
committerLaine Stump <laine@laine.org>
Mon, 17 Sep 2012 18:59:37 +0000 (14:59 -0400)
src/conf/domain_conf.c
src/conf/domain_conf.h
src/lxc/lxc_controller.c
src/parallels/parallels_driver.c
src/qemu/qemu_process.c
src/test/test_driver.c
src/vmx/vmx.c
src/xen/xm_internal.c
src/xenxs/xen_sxpr.c
src/xenxs/xen_xm.c
tests/cpuset

index dd636d5fd833e8a6e7781069a489ed6734d67a0f..4601de053c3a7f079f881f3c7d4f43946c3ec963 100644 (file)
@@ -8618,14 +8618,12 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
     if (def->placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) {
         tmp = virXPathString("string(./vcpu[1]/@cpuset)", ctxt);
         if (tmp) {
-            char *set = tmp;
-            def->cpumasklen = VIR_DOMAIN_CPUMASK_LEN;
-            if (VIR_ALLOC_N(def->cpumask, def->cpumasklen) < 0) {
-                goto no_memory;
-            }
-            if (virDomainCpuSetParse(set, 0, def->cpumask,
-                                     def->cpumasklen) < 0)
+            if (virBitmapParse(tmp, 0, &def->cpumask,
+                               VIR_DOMAIN_CPUMASK_LEN) < 0) {
+                virReportError(VIR_ERR_XML_ERROR,
+                               "%s", _("topology cpuset syntax error"));
                 goto error;
+            }
             VIR_FREE(tmp);
         }
     }
@@ -13369,7 +13367,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
     unsigned char *uuid;
     char uuidstr[VIR_UUID_STRING_BUFLEN];
     const char *type = NULL;
-    int n, allones = 1;
+    int n;
     int i;
     bool blkio = false;
 
@@ -13498,17 +13496,13 @@ virDomainDefFormatInternal(virDomainDefPtr def,
                         "  </memoryBacking>\n", NULL);
     }
 
-    for (n = 0 ; n < def->cpumasklen ; n++)
-        if (def->cpumask[n] != 1)
-            allones = 0;
-
     virBufferAddLit(buf, "  <vcpu");
     virBufferAsprintf(buf, " placement='%s'",
                       virDomainCpuPlacementModeTypeToString(def->placement_mode));
-    if (!allones) {
+
+    if (def->cpumask && !virBitmapIsAllSet(def->cpumask)) {
         char *cpumask = NULL;
-        if ((cpumask =
-             virDomainCpuSetFormat(def->cpumask, def->cpumasklen)) == NULL)
+        if ((cpumask = virBitmapFormat(def->cpumask)) == NULL)
             goto cleanup;
         virBufferAsprintf(buf, " cpuset='%s'", cpumask);
         VIR_FREE(cpumask);
index 625c5d05ac8693c1931fd71c2443a0b8db5c1bfb..7fd7fa0265cdbf3b50e49ccd35fff98f136fb0e7 100644 (file)
@@ -1641,8 +1641,7 @@ struct _virDomainDef {
     unsigned short vcpus;
     unsigned short maxvcpus;
     int placement_mode;
-    int cpumasklen;
-    char *cpumask;
+    virBitmapPtr cpumask;
 
     struct {
         unsigned long shares;
index 44ec7aa4af6c03ebbf9997bcd361a8981f313899..7e98006234ab744d9ce94c15853331fd03dc6787 100644 (file)
@@ -490,9 +490,9 @@ static int virLXCControllerSetupNUMAPolicy(virLXCControllerPtr ctrl)
  */
 static int virLXCControllerSetupCpuAffinity(virLXCControllerPtr ctrl)
 {
-    int i, hostcpus, maxcpu = CPU_SETSIZE;
+    int hostcpus, maxcpu = CPU_SETSIZE;
     virNodeInfo nodeinfo;
-    virBitmapPtr cpumap;
+    virBitmapPtr cpumap, cpumapToSet;
 
     VIR_DEBUG("Setting CPU affinity");
 
@@ -509,12 +509,10 @@ static int virLXCControllerSetupCpuAffinity(virLXCControllerPtr ctrl)
     if (!cpumap)
         return -1;
 
+    cpumapToSet = cpumap;
+
     if (ctrl->def->cpumask) {
-        /* XXX why don't we keep 'cpumask' in the libvirt cpumap
-         * format to start with ?!?! */
-        for (i = 0 ; i < maxcpu && i < ctrl->def->cpumasklen ; i++)
-            if (ctrl->def->cpumask[i])
-                ignore_value(virBitmapSetBit(cpumap, i));
+        cpumapToSet = ctrl->def->cpumask;
     } else {
         /* You may think this is redundant, but we can't assume libvirtd
          * itself is running on all pCPUs, so we need to explicitly set
@@ -527,7 +525,7 @@ static int virLXCControllerSetupCpuAffinity(virLXCControllerPtr ctrl)
      * so use '0' to indicate our own process ID. No threads are
      * running at this point
      */
-    if (virProcessInfoSetAffinity(0 /* Self */, cpumap) < 0) {
+    if (virProcessInfoSetAffinity(0 /* Self */, cpumapToSet) < 0) {
         virBitmapFree(cpumap);
         return -1;
     }
index fe1d1ea657449eea596e1756412c42a5e7d4e844..d80f8c2a80707751a57741cb4ed0e2746e3a13f3 100644 (file)
@@ -1445,8 +1445,7 @@ parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
         return -1;
     }
 
-    if (old->cpumasklen != new->cpumasklen ||
-        (memcmp(old->cpumask, new->cpumask, old->cpumasklen))) {
+    if (!virBitmapEqual(old->cpumask, new->cpumask)) {
 
         virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
                        _("changing cpu mask is not supported "
index 95c192576148d752e1039e0cc15258786efbb78b..abbe1f9ce402c60000243eb627c395f89f50bc1d 100644 (file)
@@ -1853,7 +1853,7 @@ qemuProcessInitCpuAffinity(struct qemud_driver *driver,
     int ret = -1;
     int i, hostcpus, maxcpu = QEMUD_CPUMASK_LEN;
     virNodeInfo nodeinfo;
-    virBitmapPtr cpumap;
+    virBitmapPtr cpumap, cpumapToSet;
 
     VIR_DEBUG("Setting CPU affinity");
 
@@ -1872,6 +1872,8 @@ qemuProcessInitCpuAffinity(struct qemud_driver *driver,
         return -1;
     }
 
+    cpumapToSet = cpumap;
+
     if (vm->def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO) {
         VIR_DEBUG("Set CPU affinity with advisory nodeset from numad");
         /* numad returns the NUMA node list, convert it to cpumap */
@@ -1890,11 +1892,7 @@ qemuProcessInitCpuAffinity(struct qemud_driver *driver,
     } else {
         VIR_DEBUG("Set CPU affinity with specified cpuset");
         if (vm->def->cpumask) {
-            /* XXX why don't we keep 'cpumask' in the libvirt cpumap
-             * format to start with ?!?! */
-            for (i = 0 ; i < maxcpu && i < vm->def->cpumasklen ; i++)
-                if (vm->def->cpumask[i])
-                    ignore_value(virBitmapSetBit(cpumap, i));
+            cpumapToSet = vm->def->cpumask;
         } else {
             /* You may think this is redundant, but we can't assume libvirtd
              * itself is running on all pCPUs, so we need to explicitly set
@@ -1908,7 +1906,7 @@ qemuProcessInitCpuAffinity(struct qemud_driver *driver,
      * so use '0' to indicate our own process ID. No threads are
      * running at this point
      */
-    if (virProcessInfoSetAffinity(0 /* Self */, cpumap) < 0)
+    if (virProcessInfoSetAffinity(0 /* Self */, cpumapToSet) < 0)
         goto cleanup;
 
     ret = 0;
index e15833b0519979e2bf48e88d672683ebe5569c1b..fbd8ed0eeced313e219c7cc2e003b6c05a8cb77d 100644 (file)
@@ -383,6 +383,7 @@ testDomainUpdateVCPU(virConnectPtr conn ATTRIBUTE_UNUSED,
     virVcpuInfoPtr info = &privdata->vcpu_infos[vcpu];
     unsigned char *cpumap = VIR_GET_CPUMAP(privdata->cpumaps, maplen, vcpu);
     int j;
+    bool cpu;
 
     memset(info, 0, sizeof(virVcpuInfo));
     memset(cpumap, 0, maplen);
@@ -394,7 +395,9 @@ testDomainUpdateVCPU(virConnectPtr conn ATTRIBUTE_UNUSED,
 
     if (dom->def->cpumask) {
         for (j = 0; j < maxcpu && j < VIR_DOMAIN_CPUMASK_LEN; ++j) {
-            if (dom->def->cpumask[j]) {
+            if (virBitmapGetBit(dom->def->cpumask, j, &cpu) < 0)
+                return -1;
+            if (cpu) {
                 VIR_USE_CPU(cpumap, j);
                 info->cpu = j;
             }
index db22624a79f260fde77d98132d8ebdc0962cd58a..b441fb05cfe2b1e17c7707655b053f33bf7dddda 100644 (file)
@@ -1235,6 +1235,7 @@ virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps, const char *vmx)
     int unit;
     bool hgfs_disabled = true;
     long long sharedFolder_maxNum = 0;
+    int cpumasklen;
 
     if (ctx->parseFileName == NULL) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -1417,9 +1418,10 @@ virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps, const char *vmx)
         const char *current = sched_cpu_affinity;
         int number, count = 0;
 
-        def->cpumasklen = 0;
+        cpumasklen = 0;
 
-        if (VIR_ALLOC_N(def->cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) {
+        def->cpumask = virBitmapNew(VIR_DOMAIN_CPUMASK_LEN);
+        if (!def->cpumask) {
             virReportOOMError();
             goto cleanup;
         }
@@ -1444,11 +1446,11 @@ virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps, const char *vmx)
                 goto cleanup;
             }
 
-            if (number + 1 > def->cpumasklen) {
-                def->cpumasklen = number + 1;
+            if (number + 1 > cpumasklen) {
+                cpumasklen = number + 1;
             }
 
-            def->cpumask[number] = 1;
+            ignore_value(virBitmapSetBit(def->cpumask, number));
             ++count;
 
             virSkipSpaces(&current);
@@ -3165,15 +3167,14 @@ virVMXFormatConfig(virVMXContext *ctx, virCapsPtr caps, virDomainDefPtr def,
     virBufferAsprintf(&buffer, "numvcpus = \"%d\"\n", def->maxvcpus);
 
     /* def:cpumask -> vmx:sched.cpu.affinity */
-    if (def->cpumasklen > 0) {
+    if (def->cpumask && virBitmapSize(def->cpumask) > 0) {
         virBufferAddLit(&buffer, "sched.cpu.affinity = \"");
 
         sched_cpu_affinity_length = 0;
 
-        for (i = 0; i < def->cpumasklen; ++i) {
-            if (def->cpumask[i]) {
-                ++sched_cpu_affinity_length;
-            }
+        i = -1;
+        while ((i = virBitmapNextSetBit(def->cpumask, i)) >= 0) {
+            ++sched_cpu_affinity_length;
         }
 
         if (sched_cpu_affinity_length < def->maxvcpus) {
@@ -3184,16 +3185,15 @@ virVMXFormatConfig(virVMXContext *ctx, virCapsPtr caps, virDomainDefPtr def,
             goto cleanup;
         }
 
-        for (i = 0; i < def->cpumasklen; ++i) {
-            if (def->cpumask[i]) {
-                virBufferAsprintf(&buffer, "%d", i);
-
-                if (sched_cpu_affinity_length > 1) {
-                    virBufferAddChar(&buffer, ',');
-                }
+        i = -1;
+        while ((i = virBitmapNextSetBit(def->cpumask, i)) >= 0) {
+            virBufferAsprintf(&buffer, "%d", i);
 
-                --sched_cpu_affinity_length;
+            if (sched_cpu_affinity_length > 1) {
+                virBufferAddChar(&buffer, ',');
             }
+
+            --sched_cpu_affinity_length;
         }
 
         virBufferAddLit(&buffer, "\"\n");
index f9ccbab35c1c5a1c91becdda06f1a24398b0a7e6..a4dec622905f77a450baa206309dd51e23727d07 100644 (file)
@@ -831,7 +831,7 @@ int xenXMDomainPinVcpu(virDomainPtr domain,
     char *mapstr = NULL, *mapsave = NULL;
     int i, j, n, comma = 0;
     int ret = -1;
-    char *cpuset = NULL;
+    virBitmapPtr cpuset = NULL;
     int maxcpu = XEN_MAX_PHYSICAL_CPU;
 
     if (domain == NULL || domain->conn == NULL || domain->name == NULL
@@ -885,16 +885,11 @@ int xenXMDomainPinVcpu(virDomainPtr domain,
     mapstr = virBufferContentAndReset(&mapbuf);
     mapsave = mapstr;
 
-    if (VIR_ALLOC_N(cpuset, maxcpu) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-    if (virDomainCpuSetParse(mapstr, 0, cpuset, maxcpu) < 0)
+    if (virBitmapParse(mapstr, 0, &cpuset, maxcpu) < 0)
         goto cleanup;
 
-    VIR_FREE(entry->def->cpumask);
+    virBitmapFree(entry->def->cpumask);
     entry->def->cpumask = cpuset;
-    entry->def->cpumasklen = maxcpu;
     cpuset = NULL;
 
     if (xenXMConfigSaveFile(domain->conn, entry->filename, entry->def) < 0)
index 8bb3849580bae99980c5c519c6992fa6831dba1a..03f2bfeaf51123c4b1064c0539e9f783ab2676be 100644 (file)
@@ -1197,14 +1197,8 @@ xenParseSxpr(const struct sexpr *root,
         def->mem.cur_balloon = def->mem.max_balloon;
 
     if (cpus != NULL) {
-        def->cpumasklen = VIR_DOMAIN_CPUMASK_LEN;
-        if (VIR_ALLOC_N(def->cpumask, def->cpumasklen) < 0) {
-            virReportOOMError();
-            goto error;
-        }
-
-        if (virDomainCpuSetParse(cpus, 0, def->cpumask,
-                                 def->cpumasklen) < 0) {
+        if (virBitmapParse(cpus, 0, &def->cpumask,
+                           VIR_DOMAIN_CPUMASK_LEN) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("invalid CPU mask %s"), cpus);
             goto error;
@@ -2246,7 +2240,7 @@ xenFormatSxpr(virConnectPtr conn,
         virBufferAsprintf(&buf, "(vcpu_avail %lu)", (1UL << def->vcpus) - 1);
 
     if (def->cpumask) {
-        char *ranges = virDomainCpuSetFormat(def->cpumask, def->cpumasklen);
+        char *ranges = virBitmapFormat(def->cpumask);
         if (ranges == NULL)
             goto error;
         virBufferEscapeSexpr(&buf, "(cpus '%s')", ranges);
index 479fb342df59e69c463eb541a019b03b49c9cdad..14b01f88c26b15a0301c5ea70bfcd56333eaccb3 100644 (file)
@@ -369,16 +369,8 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
 
     if (xenXMConfigGetString(conf, "cpus", &str, NULL) < 0)
         goto cleanup;
-    if (str) {
-        def->cpumasklen = 4096;
-        if (VIR_ALLOC_N(def->cpumask, def->cpumasklen) < 0)
-            goto no_memory;
-
-        if (virDomainCpuSetParse(str, 0,
-                                 def->cpumask, def->cpumasklen) < 0)
+    if (str && (virBitmapParse(str, 0, &def->cpumask, 4096) < 0))
             goto cleanup;
-    }
-
 
     if (xenXMConfigGetString(conf, "on_poweroff", &str, "destroy") < 0)
         goto cleanup;
@@ -1549,9 +1541,9 @@ virConfPtr xenFormatXM(virConnectPtr conn,
         goto no_memory;
 
     if ((def->cpumask != NULL) &&
-        ((cpus = virDomainCpuSetFormat(def->cpumask,
-                                       def->cpumasklen)) == NULL))
+        ((cpus = virBitmapFormat(def->cpumask)) == NULL)) {
         goto cleanup;
+    }
 
     if (cpus &&
         xenXMConfigSetString(conf, "cpus", cpus) < 0)
index 4618a54e0c486adcca832d22e46f1cf39f90c72d..b617d6fad9898efee147601fe9cf3488e0c08ebf 100755 (executable)
@@ -42,7 +42,7 @@ sed "s/vcpu placement='static'>/vcpu cpuset='aaa'>/" xml > xml-invalid || fail=1
 $abs_top_builddir/tools/virsh --connect test:///default define xml-invalid > out 2>&1 && fail=1
 cat <<\EOF > exp || fail=1
 error: Failed to define domain from xml-invalid
-error: internal error topology cpuset syntax error
+error: XML error: topology cpuset syntax error
 
 EOF
 compare exp out || fail=1