[libvirt] [PATCH v4 8/9] use virBitmap to store nodeinfo.

Hu Tao hutao at cn.fujitsu.com
Fri Sep 14 07:47:03 UTC 2012


---
 src/nodeinfo.c         |   26 +++++++++++---------------
 src/nodeinfo.h         |    6 +++---
 src/qemu/qemu_driver.c |   19 ++++++++++++-------
 3 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index e3d4a24..803b261 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -737,10 +737,10 @@ cleanup:
  * and max cpu is 7. The map file shows 0-4,6-7. This function parses
  * it and returns cpumap.
  */
-static char *
+static virBitmapPtr
 linuxParseCPUmap(int *max_cpuid, const char *path)
 {
-    char *map = NULL;
+    virBitmapPtr map = NULL;
     char *str = NULL;
     int max_id = 0, i;
 
@@ -749,20 +749,16 @@ linuxParseCPUmap(int *max_cpuid, const char *path)
         goto error;
     }
 
-    if (VIR_ALLOC_N(map, VIR_DOMAIN_CPUMASK_LEN) < 0) {
-        virReportOOMError();
-        goto error;
-    }
-    if (virDomainCpuSetParse(str, 0, map,
-                             VIR_DOMAIN_CPUMASK_LEN) < 0) {
+    if (virBitmapParse(str, 0, &map,
+                       VIR_DOMAIN_CPUMASK_LEN) < 0) {
         goto error;
     }
 
-    for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
-        if (map[i]) {
-            max_id = i;
-        }
+    i = -1;
+    while ((i = virBitmapNextSetBit(map, i)) >= 0) {
+        max_id = i;
     }
+
     *max_cpuid = max_id;
 
     VIR_FREE(str);
@@ -770,7 +766,7 @@ linuxParseCPUmap(int *max_cpuid, const char *path)
 
 error:
     VIR_FREE(str);
-    VIR_FREE(map);
+    virBitmapFree(map);
     return NULL;
 }
 #endif
@@ -909,14 +905,14 @@ int nodeGetMemoryStats(virConnectPtr conn ATTRIBUTE_UNUSED,
 #endif
 }
 
-char *
+virBitmapPtr
 nodeGetCPUmap(virConnectPtr conn ATTRIBUTE_UNUSED,
               int *max_id ATTRIBUTE_UNUSED,
               const char *mapname ATTRIBUTE_UNUSED)
 {
 #ifdef __linux__
     char *path;
-    char *cpumap;
+    virBitmapPtr cpumap;
 
     if (virAsprintf(&path, SYSFS_SYSTEM_PATH "/cpu/%s", mapname) < 0) {
         virReportOOMError();
diff --git a/src/nodeinfo.h b/src/nodeinfo.h
index 12090e2..182b0b6 100644
--- a/src/nodeinfo.h
+++ b/src/nodeinfo.h
@@ -46,7 +46,7 @@ int nodeGetCellsFreeMemory(virConnectPtr conn,
                            int maxCells);
 unsigned long long nodeGetFreeMemory(virConnectPtr conn);
 
-char *nodeGetCPUmap(virConnectPtr conn,
-                    int *max_id,
-                    const char *mapname);
+virBitmapPtr nodeGetCPUmap(virConnectPtr conn,
+                           int *max_id,
+                           const char *mapname);
 #endif /* __VIR_NODEINFO_H__*/
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4abfbd5..2278657 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13502,8 +13502,8 @@ qemuDomainGetPercpuStats(virDomainPtr domain,
                          int start_cpu,
                          unsigned int ncpus)
 {
-    char *map = NULL;
-    char *map2 = NULL;
+    virBitmapPtr map = NULL;
+    virBitmapPtr map2 = NULL;
     int rv = -1;
     int i, id, max_id;
     char *pos;
@@ -13515,6 +13515,7 @@ qemuDomainGetPercpuStats(virDomainPtr domain,
     virTypedParameterPtr ent;
     int param_idx;
     unsigned long long cpu_time;
+    bool result;
 
     /* return the number of supported params */
     if (nparams == 0 && ncpus != 0)
@@ -13553,7 +13554,9 @@ qemuDomainGetPercpuStats(virDomainPtr domain,
         id = start_cpu + ncpus - 1;
 
     for (i = 0; i <= id; i++) {
-        if (!map[i]) {
+        if (virBitmapGetBit(map, i, &result) < 0)
+            goto cleanup;
+        if (!result) {
             cpu_time = 0;
         } else if (virStrToLong_ull(pos, &pos, 10, &cpu_time) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -13585,7 +13588,7 @@ qemuDomainGetPercpuStats(virDomainPtr domain,
 
     /* Check that the mapping of online cpus didn't change mid-parse.  */
     map2 = nodeGetCPUmap(domain->conn, &max_id, "present");
-    if (!map2 || memcmp(map, map2, VIR_DOMAIN_CPUMASK_LEN) != 0) {
+    if (!map2 || !virBitmapEqual(map, map2)) {
         virReportError(VIR_ERR_OPERATION_INVALID, "%s",
                        _("the set of online cpus changed while reading"));
         goto cleanup;
@@ -13593,7 +13596,9 @@ qemuDomainGetPercpuStats(virDomainPtr domain,
 
     sum_cpu_pos = sum_cpu_time;
     for (i = 0; i <= id; i++) {
-        if (!map[i])
+        if (virBitmapGetBit(map, i, &result) < 0)
+            goto cleanup;
+        if (!result)
             cpu_time = 0;
         else
             cpu_time = *(sum_cpu_pos++);
@@ -13611,8 +13616,8 @@ qemuDomainGetPercpuStats(virDomainPtr domain,
 cleanup:
     VIR_FREE(sum_cpu_time);
     VIR_FREE(buf);
-    VIR_FREE(map);
-    VIR_FREE(map2);
+    virBitmapFree(map);
+    virBitmapFree(map2);
     return rv;
 }
 
-- 
1.7.10.2




More information about the libvir-list mailing list