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