#include "c-ctype.h"
#include "viralloc.h"
#include "nodeinfopriv.h"
+#include "nodeinfo.h"
#include "physmem.h"
#include "virerror.h"
#include "count-one-bits.h"
/* parses a node entry, returning number of processors in the node and
* filling arguments */
static int
-ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3)
+ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5)
-ATTRIBUTE_NONNULL(6)
-virNodeParseNode(const char *node,
+ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7)
+virNodeParseNode(const char *sysfs_prefix,
+ const char *node,
virArch arch,
int *sockets,
int *cores,
int *threads,
int *offline)
{
+ const char *prefix = sysfs_prefix ? sysfs_prefix : SYSFS_SYSTEM_PATH;
int ret = -1;
int processors = 0;
DIR *cpudir = NULL;
struct dirent *cpudirent = NULL;
+ virBitmapPtr present_cpumap = NULL;
int sock_max = 0;
cpu_set_t sock_map;
int sock;
goto cleanup;
}
+ present_cpumap = nodeGetPresentCPUBitmap(prefix);
+
/* enumerate sockets in the node */
CPU_ZERO(&sock_map);
while ((direrr = virDirRead(cpudir, &cpudirent, node)) > 0) {
if (sscanf(cpudirent->d_name, "cpu%u", &cpu) != 1)
continue;
+ if (present_cpumap && !(virBitmapIsBitSet(present_cpumap, cpu)))
+ continue;
+
if ((online = virNodeGetCpuValue(node, cpu, "online", 1)) < 0)
goto cleanup;
if (sscanf(cpudirent->d_name, "cpu%u", &cpu) != 1)
continue;
+ if (present_cpumap && !(virBitmapIsBitSet(present_cpumap, cpu)))
+ continue;
+
if ((online = virNodeGetCpuValue(node, cpu, "online", 1)) < 0)
goto cleanup;
ret = -1;
}
VIR_FREE(core_maps);
+ virBitmapFree(present_cpumap);
return ret;
}
sysfs_dir, nodedirent->d_name) < 0)
goto cleanup;
- if ((cpus = virNodeParseNode(sysfs_cpudir, arch,
+ if ((cpus = virNodeParseNode(sysfs_dir, sysfs_cpudir, arch,
&socks, &cores,
&threads, &offline)) < 0)
goto cleanup;
if (virAsprintf(&sysfs_cpudir, "%s/cpu", sysfs_dir) < 0)
goto cleanup;
- if ((cpus = virNodeParseNode(sysfs_cpudir, arch,
+ if ((cpus = virNodeParseNode(sysfs_dir, sysfs_cpudir, arch,
&socks, &cores,
&threads, &offline)) < 0)
goto cleanup;