mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 06:05:27 +00:00
nodeinfo: Use a bitmap to keep track of node CPUs
Keep track of what CPUs belong to the current node while walking through the sysfs node entry, so we don't need to do it a second time immediately afterwards. This also allows us to loop through all CPUs that are part of a node in guaranteed ascending order, which is something that is required for some upcoming changes.
This commit is contained in:
parent
b909e9fb2c
commit
05be606282
@ -411,8 +411,10 @@ virNodeParseNode(const char *sysfs_prefix,
|
||||
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;
|
||||
@ -437,6 +439,12 @@ virNodeParseNode(const char *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;
|
||||
|
||||
/* enumerate sockets in the node */
|
||||
if (!(sockets_map = virBitmapNew(ID_MAX + 1)))
|
||||
goto cleanup;
|
||||
@ -448,6 +456,10 @@ virNodeParseNode(const char *sysfs_prefix,
|
||||
if (!virBitmapIsBitSet(present_cpumap, cpu))
|
||||
continue;
|
||||
|
||||
/* Mark this CPU as part of the current node */
|
||||
if (virBitmapSetBit(node_cpus_map, cpu) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (!virBitmapIsBitSet(online_cpus_map, cpu))
|
||||
continue;
|
||||
|
||||
@ -481,13 +493,11 @@ virNodeParseNode(const char *sysfs_prefix,
|
||||
if (!(cores_maps[i] = virBitmapNew(ID_MAX + 1)))
|
||||
goto cleanup;
|
||||
|
||||
/* iterate over all CPU's in the node */
|
||||
rewinddir(cpudir);
|
||||
while ((direrr = virDirRead(cpudir, &cpudirent, node)) > 0) {
|
||||
if (sscanf(cpudirent->d_name, "cpu%u", &cpu) != 1)
|
||||
continue;
|
||||
/* Iterate over all CPUs in the node, in ascending order */
|
||||
for (cpu = 0; cpu < npresent_cpus; cpu++) {
|
||||
|
||||
if (!virBitmapIsBitSet(present_cpumap, cpu))
|
||||
/* Skip CPUs that are not part of the current node */
|
||||
if (!virBitmapIsBitSet(node_cpus_map, cpu))
|
||||
continue;
|
||||
|
||||
if (!virBitmapIsBitSet(online_cpus_map, cpu)) {
|
||||
@ -530,9 +540,6 @@ virNodeParseNode(const char *sysfs_prefix,
|
||||
*threads = siblings;
|
||||
}
|
||||
|
||||
if (direrr < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* finalize the returned data */
|
||||
*sockets = virBitmapCountBits(sockets_map);
|
||||
|
||||
@ -558,6 +565,7 @@ virNodeParseNode(const char *sysfs_prefix,
|
||||
virBitmapFree(cores_maps[i]);
|
||||
VIR_FREE(cores_maps);
|
||||
virBitmapFree(sockets_map);
|
||||
virBitmapFree(node_cpus_map);
|
||||
virBitmapFree(online_cpus_map);
|
||||
virBitmapFree(present_cpumap);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user