[libvirt] [PATCH 10/10] nodeinfo: Calculate present and online CPUs only once

Andrea Bolognani abologna at redhat.com
Mon Jul 20 13:59:02 UTC 2015


Move the calls to the respective functions from virNodeParseNode(),
which is executed once for every NUMA node, to
linuxNodeInfoCPUPopulate(), which is executed just once per host.
---
 src/nodeinfo.c | 49 +++++++++++++++++++++++++++++--------------------
 1 file changed, 29 insertions(+), 20 deletions(-)

diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index 503fcdd..0f72a25 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -390,12 +390,15 @@ virNodeParseSocket(const char *dir,
 /* parses a node entry, returning number of processors in the node and
  * filling arguments */
 static int
-ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
-ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5)
-ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7)
-virNodeParseNode(const char *sysfs_prefix,
-                 const char *node,
+ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3)
+ATTRIBUTE_NONNULL(5) ATTRIBUTE_NONNULL(6)
+ATTRIBUTE_NONNULL(7) ATTRIBUTE_NONNULL(8)
+ATTRIBUTE_NONNULL(9)
+virNodeParseNode(const char *node,
                  virArch arch,
+                 virBitmapPtr present_cpus_map,
+                 int npresent_cpus,
+                 virBitmapPtr online_cpus_map,
                  int *sockets,
                  int *cores,
                  int *threads,
@@ -408,12 +411,9 @@ virNodeParseNode(const char *sysfs_prefix,
     int processors = 0;
     DIR *cpudir = NULL;
     struct dirent *cpudirent = NULL;
-    virBitmapPtr present_cpumap = NULL;
-    virBitmapPtr online_cpus_map = NULL;
     virBitmapPtr node_cpus_map = NULL;
     virBitmapPtr sockets_map = NULL;
     virBitmapPtr *cores_maps = NULL;
-    int npresent_cpus;
     int sock_max = 0;
     int sock;
     int core;
@@ -431,13 +431,6 @@ virNodeParseNode(const char *sysfs_prefix,
         goto cleanup;
     }
 
-    present_cpumap = nodeGetPresentCPUBitmap(sysfs_prefix, &npresent_cpus);
-    if (!present_cpumap)
-        goto cleanup;
-    online_cpus_map = nodeGetOnlineCPUBitmap(sysfs_prefix, NULL);
-    if (!online_cpus_map)
-        goto cleanup;
-
     /* Keep track of the CPUs that belong to the current node */
     if (!(node_cpus_map = virBitmapNew(npresent_cpus)))
         goto cleanup;
@@ -450,7 +443,7 @@ virNodeParseNode(const char *sysfs_prefix,
         if (sscanf(cpudirent->d_name, "cpu%u", &cpu) != 1)
             continue;
 
-        if (!virBitmapIsBitSet(present_cpumap, cpu))
+        if (!virBitmapIsBitSet(present_cpus_map, cpu))
             continue;
 
         /* Mark this CPU as part of the current node */
@@ -563,8 +556,6 @@ virNodeParseNode(const char *sysfs_prefix,
     VIR_FREE(cores_maps);
     virBitmapFree(sockets_map);
     virBitmapFree(node_cpus_map);
-    virBitmapFree(online_cpus_map);
-    virBitmapFree(present_cpumap);
 
     return ret;
 }
@@ -576,10 +567,13 @@ linuxNodeInfoCPUPopulate(const char *sysfs_prefix,
                          virNodeInfoPtr nodeinfo)
 {
     const char *prefix = sysfs_prefix ? sysfs_prefix : SYSFS_SYSTEM_PATH;
+    virBitmapPtr present_cpus_map = NULL;
+    virBitmapPtr online_cpus_map = NULL;
     char line[1024];
     DIR *nodedir = NULL;
     struct dirent *nodedirent = NULL;
     int cpus, cores, socks, threads, offline = 0;
+    int npresent_cpus;
     unsigned int node;
     int ret = -1;
     char *sysfs_nodedir = NULL;
@@ -667,6 +661,15 @@ linuxNodeInfoCPUPopulate(const char *sysfs_prefix,
         }
     }
 
+    /* Get information about what CPUs are present in the host and what
+     * CPUs are online, so that we don't have to so for each node */
+    present_cpus_map = nodeGetPresentCPUBitmap(sysfs_prefix, &npresent_cpus);
+    if (!present_cpus_map)
+        goto cleanup;
+    online_cpus_map = nodeGetOnlineCPUBitmap(sysfs_prefix, NULL);
+    if (!online_cpus_map)
+        goto cleanup;
+
     /* OK, we've parsed clock speed out of /proc/cpuinfo. Get the
      * core, node, socket, thread and topology information from /sys
      */
@@ -688,7 +691,9 @@ linuxNodeInfoCPUPopulate(const char *sysfs_prefix,
                         prefix, nodedirent->d_name) < 0)
             goto cleanup;
 
-        if ((cpus = virNodeParseNode(sysfs_prefix, sysfs_cpudir, arch,
+        if ((cpus = virNodeParseNode(sysfs_cpudir, arch,
+                                     present_cpus_map, npresent_cpus,
+                                     online_cpus_map,
                                      &socks, &cores,
                                      &threads, &offline)) < 0)
             goto cleanup;
@@ -719,7 +724,9 @@ linuxNodeInfoCPUPopulate(const char *sysfs_prefix,
     if (virAsprintf(&sysfs_cpudir, "%s/cpu", prefix) < 0)
         goto cleanup;
 
-    if ((cpus = virNodeParseNode(sysfs_prefix, sysfs_cpudir, arch,
+    if ((cpus = virNodeParseNode(sysfs_cpudir, arch,
+                                 present_cpus_map, npresent_cpus,
+                                 online_cpus_map,
                                  &socks, &cores,
                                  &threads, &offline)) < 0)
         goto cleanup;
@@ -773,6 +780,8 @@ linuxNodeInfoCPUPopulate(const char *sysfs_prefix,
         ret = -1;
     }
 
+    virBitmapFree(present_cpus_map);
+    virBitmapFree(online_cpus_map);
     VIR_FREE(sysfs_nodedir);
     VIR_FREE(sysfs_cpudir);
     return ret;
-- 
2.4.3




More information about the libvir-list mailing list