提交 6395ec1c 编写于 作者: A Andrea Bolognani 提交者: Peter Krempa

nodeinfo: Calculate present and online CPUs only once

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.
上级 05be6062
......@@ -391,12 +391,14 @@ 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(1) ATTRIBUTE_NONNULL(3)
ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5)
ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7)
virNodeParseNode(const char *sysfs_prefix,
const char *node,
ATTRIBUTE_NONNULL(8)
virNodeParseNode(const char *node,
virArch arch,
virBitmapPtr present_cpus_map,
virBitmapPtr online_cpus_map,
int *sockets,
int *cores,
int *threads,
......@@ -409,12 +411,10 @@ 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 npresent_cpus = virBitmapSize(present_cpus_map);
int sock_max = 0;
int sock;
int core;
......@@ -432,15 +432,6 @@ virNodeParseNode(const char *sysfs_prefix,
goto cleanup;
}
present_cpumap = nodeGetPresentCPUBitmap(sysfs_prefix);
if (!present_cpumap)
goto cleanup;
online_cpus_map = nodeGetOnlineCPUBitmap(sysfs_prefix);
if (!online_cpus_map)
goto cleanup;
npresent_cpus = virBitmapSize(present_cpumap);
/* Keep track of the CPUs that belong to the current node */
if (!(node_cpus_map = virBitmapNew(npresent_cpus)))
goto cleanup;
......@@ -453,7 +444,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 */
......@@ -566,8 +557,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;
}
......@@ -579,6 +568,8 @@ 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;
......@@ -670,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);
if (!present_cpus_map)
goto cleanup;
online_cpus_map = nodeGetOnlineCPUBitmap(sysfs_prefix);
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
*/
......@@ -691,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,
online_cpus_map,
&socks, &cores,
&threads, &offline)) < 0)
goto cleanup;
......@@ -722,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,
online_cpus_map,
&socks, &cores,
&threads, &offline)) < 0)
goto cleanup;
......@@ -776,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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册