#ifdef __linux__
# define CPUINFO_PATH "/proc/cpuinfo"
# define SYSFS_SYSTEM_PATH "/sys/devices/system"
-# define SYSFS_CPU_PATH SYSFS_SYSTEM_PATH"/cpu"
# define PROCSTAT_PATH "/proc/stat"
# define MEMINFO_PATH "/proc/meminfo"
# define SYSFS_MEMORY_SHARED_PATH "/sys/kernel/mm/ksm"
}
static int
-nodeCapsInitNUMAFake(virCapsPtr caps ATTRIBUTE_UNUSED)
+nodeCapsInitNUMAFake(const char *prefix,
+ const char *cpupath ATTRIBUTE_UNUSED,
+ virCapsPtr caps ATTRIBUTE_UNUSED)
{
virNodeInfo nodeinfo;
virCapsHostNUMACellCPUPtr cpus;
int id, cid;
int onlinecpus ATTRIBUTE_UNUSED;
- if (nodeGetInfo(NULL, &nodeinfo) < 0)
+ if (nodeGetInfo(prefix, &nodeinfo) < 0)
return -1;
ncpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
for (c = 0; c < nodeinfo.cores; c++) {
for (t = 0; t < nodeinfo.threads; t++) {
#ifdef __linux__
- if (virNodeGetCpuValue(SYSFS_CPU_PATH, id, "online", 1)) {
+ if (virNodeGetCpuValue(cpupath, id, "online", 1)) {
#endif
cpus[cid].id = id;
cpus[cid].socket_id = s;
/* returns 1 on success, 0 if the detection failed and -1 on hard error */
static int
-virNodeCapsFillCPUInfo(int cpu_id ATTRIBUTE_UNUSED,
+virNodeCapsFillCPUInfo(const char *cpupath ATTRIBUTE_UNUSED,
+ int cpu_id ATTRIBUTE_UNUSED,
virCapsHostNUMACellCPUPtr cpu ATTRIBUTE_UNUSED)
{
#ifdef __linux__
int tmp;
cpu->id = cpu_id;
- if ((tmp = virNodeGetCpuValue(SYSFS_CPU_PATH, cpu_id,
+ if ((tmp = virNodeGetCpuValue(cpupath, cpu_id,
"topology/physical_package_id", -1)) < 0)
return 0;
cpu->socket_id = tmp;
- if ((tmp = virNodeGetCpuValue(SYSFS_CPU_PATH, cpu_id,
+ if ((tmp = virNodeGetCpuValue(cpupath, cpu_id,
"topology/core_id", -1)) < 0)
return 0;
cpu->core_id = tmp;
- if (!(cpu->siblings = virNodeGetSiblingsList(SYSFS_CPU_PATH, cpu_id)))
+ if (!(cpu->siblings = virNodeGetSiblingsList(cpupath, cpu_id)))
return -1;
return 0;
}
int
-nodeCapsInitNUMA(virCapsPtr caps)
+nodeCapsInitNUMA(const char *sysfs_prefix,
+ virCapsPtr caps)
{
+ const char *prefix = sysfs_prefix ? sysfs_prefix : SYSFS_SYSTEM_PATH;
+ char *cpupath;
int n;
unsigned long long memory;
virCapsHostNUMACellCPUPtr cpus = NULL;
bool topology_failed = false;
int max_node;
- if (!virNumaIsAvailable())
- return nodeCapsInitNUMAFake(caps);
+ if (virAsprintf(&cpupath, "%s/cpu", prefix) < 0)
+ return -1;
+
+ if (!virNumaIsAvailable()) {
+ ret = nodeCapsInitNUMAFake(prefix, cpupath, caps);
+ goto cleanup;
+ }
if ((max_node = virNumaGetMaxNode()) < 0)
goto cleanup;
for (i = 0; i < virBitmapSize(cpumap); i++) {
if (virBitmapIsBitSet(cpumap, i)) {
- if (virNodeCapsFillCPUInfo(i, cpus + cpu++) < 0) {
+ if (virNodeCapsFillCPUInfo(cpupath, i, cpus + cpu++) < 0) {
topology_failed = true;
virResetLastError();
}
VIR_FREE(cpus);
VIR_FREE(siblings);
VIR_FREE(pageinfo);
+ VIR_FREE(cpupath);
return ret;
}