#include "virtypedparam.h"
#include "virstring.h"
#include "virnuma.h"
+#include "virlog.h"
#define VIR_FROM_THIS VIR_FROM_NONE
+VIR_LOG_INIT("nodeinfo");
+
#if defined(__FreeBSD__) || defined(__APPLE__)
static int
appleFreebsdNodeGetCPUCount(void)
int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
const char *sysfs_dir,
+ virArch arch,
virNodeInfoPtr nodeinfo)
{
char line[1024];
/* Start with parsing CPU clock speed from /proc/cpuinfo */
while (fgets(line, sizeof(line), cpuinfo) != NULL) {
-# if defined(__x86_64__) || \
- defined(__amd64__) || \
- defined(__i386__)
- char *buf = line;
- if (STRPREFIX(buf, "cpu MHz")) {
- char *p;
- unsigned int ui;
-
- buf += 7;
- while (*buf && c_isspace(*buf))
- buf++;
+ if (ARCH_IS_X86(arch)) {
+ char *buf = line;
+ if (STRPREFIX(buf, "cpu MHz")) {
+ char *p;
+ unsigned int ui;
+
+ buf += 7;
+ while (*buf && c_isspace(*buf))
+ buf++;
+
+ if (*buf != ':' || !buf[1]) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("parsing cpu MHz from cpuinfo"));
+ goto cleanup;
+ }
- if (*buf != ':' || !buf[1]) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("parsing cpu MHz from cpuinfo"));
- goto cleanup;
+ if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0 &&
+ /* Accept trailing fractional part. */
+ (*p == '\0' || *p == '.' || c_isspace(*p)))
+ nodeinfo->mhz = ui;
}
- if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0 &&
- /* Accept trailing fractional part. */
- (*p == '\0' || *p == '.' || c_isspace(*p)))
- nodeinfo->mhz = ui;
- }
+ } else if (ARCH_IS_PPC(arch)) {
+ char *buf = line;
+ if (STRPREFIX(buf, "clock")) {
+ char *p;
+ unsigned int ui;
-# elif defined(__powerpc__) || \
- defined(__powerpc64__)
- char *buf = line;
- if (STRPREFIX(buf, "clock")) {
- char *p;
- unsigned int ui;
+ buf += 5;
+ while (*buf && c_isspace(*buf))
+ buf++;
- buf += 5;
- while (*buf && c_isspace(*buf))
- buf++;
+ if (*buf != ':' || !buf[1]) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("parsing cpu MHz from cpuinfo"));
+ goto cleanup;
+ }
- if (*buf != ':' || !buf[1]) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("parsing cpu MHz from cpuinfo"));
- goto cleanup;
+ if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0 &&
+ /* Accept trailing fractional part. */
+ (*p == '\0' || *p == '.' || c_isspace(*p)))
+ nodeinfo->mhz = ui;
+ /* No other interesting infos are available in /proc/cpuinfo.
+ * However, there is a line identifying processor's version,
+ * identification and machine, but we don't want it to be caught
+ * and parsed in next iteration, because it is not in expected
+ * format and thus lead to error. */
}
+ } else if (ARCH_IS_ARM(arch)) {
+ char *buf = line;
+ if (STRPREFIX(buf, "BogoMIPS")) {
+ char *p;
+ unsigned int ui;
- if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0 &&
- /* Accept trailing fractional part. */
- (*p == '\0' || *p == '.' || c_isspace(*p)))
- nodeinfo->mhz = ui;
- /* No other interesting infos are available in /proc/cpuinfo.
- * However, there is a line identifying processor's version,
- * identification and machine, but we don't want it to be caught
- * and parsed in next iteration, because it is not in expected
- * format and thus lead to error. */
- }
-# elif defined(__arm__) || defined(__aarch64__)
- char *buf = line;
- if (STRPREFIX(buf, "BogoMIPS")) {
- char *p;
- unsigned int ui;
+ buf += 8;
+ while (*buf && c_isspace(*buf))
+ buf++;
- buf += 8;
- while (*buf && c_isspace(*buf))
- buf++;
+ if (*buf != ':' || !buf[1]) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("parsing cpu MHz from cpuinfo"));
+ goto cleanup;
+ }
- if (*buf != ':' || !buf[1]) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("parsing cpu MHz from cpuinfo"));
- goto cleanup;
+ if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0
+ /* Accept trailing fractional part. */
+ && (*p == '\0' || *p == '.' || c_isspace(*p)))
+ nodeinfo->mhz = ui;
}
-
- if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0
- /* Accept trailing fractional part. */
- && (*p == '\0' || *p == '.' || c_isspace(*p)))
- nodeinfo->mhz = ui;
+ } else if (ARCH_IS_S390(arch)) {
+ /* s390x has no realistic value for CPU speed,
+ * assign a value of zero to signify this */
+ nodeinfo->mhz = 0;
+ } else {
+ VIR_WARN("Parser for /proc/cpuinfo needs to be adapted for your architecture");
+ break;
}
-# elif defined(__s390__) || \
- defined(__s390x__)
- /* s390x has no realistic value for CPU speed,
- * assign a value of zero to signify this */
- nodeinfo->mhz = 0;
-# else
-# warning Parser for /proc/cpuinfo needs to be adapted for your architecture
-# endif
}
/* OK, we've parsed clock speed out of /proc/cpuinfo. Get the
return -1;
}
- ret = linuxNodeInfoCPUPopulate(cpuinfo, SYSFS_SYSTEM_PATH, nodeinfo);
+ ret = linuxNodeInfoCPUPopulate(cpuinfo, SYSFS_SYSTEM_PATH,
+ hostarch, nodeinfo);
if (ret < 0)
goto cleanup;
#define VIR_FROM_THIS VIR_FROM_NONE
-#if ! (defined __linux__ && (defined(__x86_64__) || \
- defined(__amd64__) || \
- defined(__i386__) || \
- defined(__powerpc__) || \
- defined(__powerpc64__)))
+#if !(defined __linux__)
int
main(void)
static int
linuxTestCompareFiles(const char *cpuinfofile,
char *sysfs_dir,
+ virArch arch,
const char *outputfile)
{
int ret = -1;
goto fail;
memset(&nodeinfo, 0, sizeof(nodeinfo));
- if (linuxNodeInfoCPUPopulate(cpuinfo, sysfs_dir, &nodeinfo) < 0) {
+ if (linuxNodeInfoCPUPopulate(cpuinfo, sysfs_dir, arch, &nodeinfo) < 0) {
if (virTestGetDebug()) {
virErrorPtr error = virSaveLastError();
if (error && error->code != VIR_ERR_OK)
}
+struct linuxTestNodeInfoData {
+ const char *testName;
+ virArch arch;
+};
+
static int
-linuxTestNodeInfo(const void *data)
+linuxTestNodeInfo(const void *opaque)
{
int result = -1;
char *cpuinfo = NULL;
char *sysfs_dir = NULL;
char *output = NULL;
- const char *test = data;
- const char *arch = "x86";
-
-# if defined(__powerpc__) || \
- defined(__powerpc64__)
- arch = "ppc";
-# endif
+ struct linuxTestNodeInfoData *data = (struct linuxTestNodeInfoData *) opaque;
+ const char *archStr = virArchToString(data->arch);
if (virAsprintf(&sysfs_dir, "%s/nodeinfodata/linux-%s",
- abs_srcdir, test) < 0 ||
+ abs_srcdir, data->testName) < 0 ||
virAsprintf(&cpuinfo, "%s/nodeinfodata/linux-%s-%s.cpuinfo",
- abs_srcdir, arch, test) < 0 ||
+ abs_srcdir, archStr, data->testName) < 0 ||
virAsprintf(&output, "%s/nodeinfodata/linux-%s-%s.expected",
- abs_srcdir, arch, test) < 0) {
+ abs_srcdir, archStr, data->testName) < 0) {
goto cleanup;
}
- result = linuxTestCompareFiles(cpuinfo, sysfs_dir, output);
+ result = linuxTestCompareFiles(cpuinfo, sysfs_dir, data->arch, output);
cleanup:
VIR_FREE(cpuinfo);
{
int ret = 0;
size_t i;
- const char *nodeData[] = {
- "test1",
-# if !(defined(__powerpc__) || \
- defined(__powerpc64__))
- "test2",
- "test3",
- "test4",
- "test5",
- "test6",
- "test7",
- "test8",
-# endif
+ const struct linuxTestNodeInfoData nodeData[] = {
+ {"test1", VIR_ARCH_X86_64},
+ {"test1", VIR_ARCH_PPC},
+ {"test2", VIR_ARCH_X86_64},
+ {"test3", VIR_ARCH_X86_64},
+ {"test4", VIR_ARCH_X86_64},
+ {"test5", VIR_ARCH_X86_64},
+ {"test6", VIR_ARCH_X86_64},
+ {"test7", VIR_ARCH_X86_64},
+ {"test8", VIR_ARCH_X86_64},
};
if (virInitialize() < 0)
return EXIT_FAILURE;
for (i = 0; i < ARRAY_CARDINALITY(nodeData); i++)
- if (virtTestRun(nodeData[i], linuxTestNodeInfo, nodeData[i]) != 0)
+ if (virtTestRun(nodeData[i].testName, linuxTestNodeInfo, &nodeData[i]) != 0)
ret = -1;
# define DO_TEST_CPU_STATS(name, ncpus) \