[libvirt] [PATCH v2 7/9] use virBitmap to store cells' cpumask info.

Hu Tao hutao at cn.fujitsu.com
Thu Sep 6 10:13:58 UTC 2012


---
 src/conf/cpu_conf.c     |   17 ++++++-----------
 src/conf/cpu_conf.h     |    3 ++-
 src/qemu/qemu_command.c |   43 +++++++------------------------------------
 3 files changed, 15 insertions(+), 48 deletions(-)

diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index 87e9540..9fe93e6 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -83,7 +83,7 @@ virCPUDefFree(virCPUDefPtr def)
     virCPUDefFreeModel(def);
 
     for (i = 0 ; i < def->ncells ; i++) {
-        VIR_FREE(def->cells[i].cpumask);
+        virBitmapFree(def->cells[i].cpumask);
         VIR_FREE(def->cells[i].cpustr);
     }
     VIR_FREE(def->cells);
@@ -164,11 +164,10 @@ virCPUDefCopy(const virCPUDefPtr cpu)
             copy->cells[i].cellid = cpu->cells[i].cellid;
             copy->cells[i].mem = cpu->cells[i].mem;
 
-            if (VIR_ALLOC_N(copy->cells[i].cpumask,
-                            VIR_DOMAIN_CPUMASK_LEN) < 0)
+            copy->cells[i].cpumask = virBitmapCopy(cpu->cells[i].cpumask);
+
+            if (!copy->cells[i].cpumask)
                 goto no_memory;
-            memcpy(copy->cells[i].cpumask, cpu->cells[i].cpumask,
-                   VIR_DOMAIN_CPUMASK_LEN);
 
             if (!(copy->cells[i].cpustr = strdup(cpu->cells[i].cpustr)))
                 goto no_memory;
@@ -454,7 +453,6 @@ virCPUDefParseXML(const xmlNodePtr node,
 
         for (i = 0 ; i < n ; i++) {
             char *cpus, *memory;
-            int cpumasklen = VIR_DOMAIN_CPUMASK_LEN;
             int ret, ncpus = 0;
 
             def->cells[i].cellid = i;
@@ -466,11 +464,8 @@ virCPUDefParseXML(const xmlNodePtr node,
             }
             def->cells[i].cpustr = cpus;
 
-            if (VIR_ALLOC_N(def->cells[i].cpumask, cpumasklen) < 0)
-                goto no_memory;
-
-            ncpus = virDomainCpuSetParse(cpus, 0, def->cells[i].cpumask,
-                                         cpumasklen);
+            ncpus = virBitmapParse(cpus, 0, &def->cells[i].cpumask,
+                                   VIR_DOMAIN_CPUMASK_LEN);
             if (ncpus <= 0)
                 goto error;
             def->cells_cpus += ncpus;
diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h
index 601e208..4e03fd2 100644
--- a/src/conf/cpu_conf.h
+++ b/src/conf/cpu_conf.h
@@ -27,6 +27,7 @@
 # include "util.h"
 # include "buf.h"
 # include "xml.h"
+# include "bitmap.h"
 
 # define VIR_CPU_VENDOR_ID_LENGTH 12
 
@@ -92,7 +93,7 @@ typedef struct _virCellDef virCellDef;
 typedef virCellDef *virCellDefPtr;
 struct _virCellDef {
    int cellid;
-   char *cpumask;	/* CPUs that are part of this node */
+   virBitmapPtr cpumask;	/* CPUs that are part of this node */
    char *cpustr;	/* CPUs stored in string form for dumpxml */
    unsigned int mem;	/* Node memory in kB */
 };
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a83d6de..5fb607f 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4260,54 +4260,25 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
     return virBufferContentAndReset(&buf);
 }
 
-static void
-qemuBuildNumaCPUArgStr(char *cpumask, virBufferPtr buf)
-{
-    int i, first, last;
-    int cpuSet = 0;
-
-    first = last = 0;
-    for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
-        if (cpumask[i]) {
-            if (cpuSet) {
-                last = i;
-            } else {
-                first = last = i;
-                cpuSet = 1;
-            }
-        } else {
-            if (!cpuSet)
-                continue;
-            if (first == last)
-                virBufferAsprintf(buf, "%d,", first);
-            else
-                virBufferAsprintf(buf, "%d-%d,", first, last);
-            cpuSet = 0;
-        }
-    }
-
-    if (cpuSet) {
-        if (first == last)
-            virBufferAsprintf(buf, "%d,", first);
-        else
-            virBufferAsprintf(buf, "%d-%d,", first, last);
-    }
-}
-
 static int
 qemuBuildNumaArgStr(const virDomainDefPtr def, virCommandPtr cmd)
 {
     int i;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
+    char *cpumask;
 
     for (i = 0; i < def->cpu->ncells; i++) {
         virCommandAddArg(cmd, "-numa");
         virBufferAsprintf(&buf, "node,nodeid=%d", def->cpu->cells[i].cellid);
         virBufferAddLit(&buf, ",cpus=");
-        qemuBuildNumaCPUArgStr(def->cpu->cells[i].cpumask, &buf);
+        cpumask = virBitmapFormat(def->cpu->cells[i].cpumask);
+        if (cpumask) {
+            virBufferAsprintf(&buf, "%s", cpumask);
+            VIR_FREE(cpumask);
+        }
         def->cpu->cells[i].mem = VIR_DIV_UP(def->cpu->cells[i].mem,
                                             1024) * 1024;
-        virBufferAsprintf(&buf, "mem=%d", def->cpu->cells[i].mem / 1024);
+        virBufferAsprintf(&buf, ",mem=%d", def->cpu->cells[i].mem / 1024);
 
         if (virBufferError(&buf))
             goto error;
-- 
1.7.10.2




More information about the libvir-list mailing list