[libvirt] [PATCH 7/8] virNodeGetCPUMapFlags: Implement support function in nodeinfo

Viktor Mihajlovski mihajlov at linux.vnet.ibm.com
Mon Oct 15 12:43:33 UTC 2012


Added an implemention of virNodeGetCPUMapFlags to nodeinfo.c,
(nodeGetCPUMapFlags) which can be used by all drivers for a Linux
hypervisor host.

Signed-off-by: Viktor Mihajlovski <mihajlov at linux.vnet.ibm.com>
---
 src/libvirt_private.syms |    1 +
 src/nodeinfo.c           |   49 ++++++++++++++++++++++++++++++++++++++++++++++
 src/nodeinfo.h           |    6 +++++
 3 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index fe31bbe..44d5927 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -900,6 +900,7 @@ virNodeDeviceObjUnlock;
 # nodeinfo.h
 nodeCapsInitNUMA;
 nodeGetCPUmap;
+nodeGetCPUMapFlags;
 nodeGetCPUStats;
 nodeGetCellsFreeMemory;
 nodeGetFreeMemory;
diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index c0e60d8..84cf796 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -1203,6 +1203,55 @@ nodeGetMemoryParameters(virConnectPtr conn ATTRIBUTE_UNUSED,
 #endif
 }
 
+int nodeGetCPUMapFlags(virConnectPtr conn,
+                       unsigned char **cpumap,
+                       unsigned int *online,
+                       unsigned int flags)
+{
+    virBitmapPtr cpusPresent = NULL;
+    virBitmapPtr cpusOnline = NULL;
+    int maxpresent, maxonline, i;
+    int ret = -1;
+
+    virCheckFlags(0, 1);
+
+    if (!(cpusPresent = nodeGetCPUmap(conn, &maxpresent, "present"))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Unable to retrieve 'present' CPU map"));
+        goto cleanup;
+    }
+
+    if (!(cpusOnline = nodeGetCPUmap(conn, &maxonline, "online"))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Unable to retrieve 'online' CPU map"));
+        goto cleanup;
+    }
+
+    if (cpumap && VIR_ALLOC_N(*cpumap, VIR_CPU_MAPLEN(maxpresent)) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if (online)
+        *online = 0;
+
+    i = -1;
+    while ((i=virBitmapNextSetBit(cpusOnline, i)) >= 0) {
+        if (online)
+            (*online)++;
+
+        if (cpumap)
+            VIR_USE_CPU(*cpumap,i);
+    }
+
+    ret = maxpresent + 1;
+
+cleanup:
+    virBitmapFree(cpusPresent);
+    virBitmapFree(cpusOnline);
+    return ret;
+}
+
 #if HAVE_NUMACTL
 # if LIBNUMA_API_VERSION <= 1
 #  define NUMA_MAX_N_CPUS 4096
diff --git a/src/nodeinfo.h b/src/nodeinfo.h
index 2eda846..e210e6b 100644
--- a/src/nodeinfo.h
+++ b/src/nodeinfo.h
@@ -59,4 +59,10 @@ int nodeSetMemoryParameters(virConnectPtr conn,
                             virTypedParameterPtr params,
                             int nparams,
                             unsigned int flags);
+
+int nodeGetCPUMapFlags(virConnectPtr conn,
+                       unsigned char **cpumap,
+                       unsigned int *online,
+                       unsigned int flags);
+
 #endif /* __VIR_NODEINFO_H__*/
-- 
1.7.0.4




More information about the libvir-list mailing list