diff --git a/src/nodeinfo.c b/src/nodeinfo.c index dbfbf5449a9389eecbc17d450845332caf8a7df1..cd84c8e9aa1fa6f9cf11c60cbbcab8d15c16606f 100644 --- a/src/nodeinfo.c +++ b/src/nodeinfo.c @@ -52,9 +52,12 @@ #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) @@ -557,6 +560,7 @@ virNodeParseNode(const char *node, int linuxNodeInfoCPUPopulate(FILE *cpuinfo, const char *sysfs_dir, + virArch arch, virNodeInfoPtr nodeinfo) { char line[1024]; @@ -571,86 +575,83 @@ int linuxNodeInfoCPUPopulate(FILE *cpuinfo, /* 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 @@ -1057,7 +1058,8 @@ int nodeGetInfo(virNodeInfoPtr nodeinfo) return -1; } - ret = linuxNodeInfoCPUPopulate(cpuinfo, SYSFS_SYSTEM_PATH, nodeinfo); + ret = linuxNodeInfoCPUPopulate(cpuinfo, SYSFS_SYSTEM_PATH, + hostarch, nodeinfo); if (ret < 0) goto cleanup; diff --git a/src/nodeinfopriv.h b/src/nodeinfopriv.h index 66923639b112e6e100cf67daf8137a9cbf15bf44..8bfbe1ee70cbc4c617d3e7bde1a20a09e3111478 100644 --- a/src/nodeinfopriv.h +++ b/src/nodeinfopriv.h @@ -27,6 +27,7 @@ # ifdef __linux__ int linuxNodeInfoCPUPopulate(FILE *cpuinfo, const char *sysfs_dir, + virArch arch, virNodeInfoPtr nodeinfo); int linuxNodeGetCPUStats(FILE *procstat, diff --git a/src/util/virarch.h b/src/util/virarch.h index c4d67cee326ad16744c7185cca16641287e6909b..d395e58a00e0f9a78d326f3f5ff327a427d421d6 100644 --- a/src/util/virarch.h +++ b/src/util/virarch.h @@ -73,6 +73,20 @@ typedef enum { # define ARCH_IS_X86(arch) ((arch) == VIR_ARCH_X86_64 ||\ (arch) == VIR_ARCH_I686) +# define ARCH_IS_PPC(arch) ((arch) == VIR_ARCH_PPC ||\ + (arch) == VIR_ARCH_PPCLE ||\ + (arch) == VIR_ARCH_PPC64 ||\ + (arch) == VIR_ARCH_PPC64LE ||\ + (arch) == VIR_ARCH_PPCEMB) + +# define ARCH_IS_ARM(arch) ((arch) == VIR_ARCH_ARMV6L ||\ + (arch) == VIR_ARCH_ARMV7L ||\ + (arch) == VIR_ARCH_ARMV7B ||\ + (arch) == VIR_ARCH_AARCH64) + +# define ARCH_IS_S390(arch) ((arch) == VIR_ARCH_S390 ||\ + (arch) == VIR_ARCH_S390X) + typedef enum { VIR_ARCH_LITTLE_ENDIAN, VIR_ARCH_BIG_ENDIAN, diff --git a/tests/nodeinfodata/linux-x86-test1.cpuinfo b/tests/nodeinfodata/linux-x86_64-test1.cpuinfo similarity index 100% rename from tests/nodeinfodata/linux-x86-test1.cpuinfo rename to tests/nodeinfodata/linux-x86_64-test1.cpuinfo diff --git a/tests/nodeinfodata/linux-x86-test1.expected b/tests/nodeinfodata/linux-x86_64-test1.expected similarity index 100% rename from tests/nodeinfodata/linux-x86-test1.expected rename to tests/nodeinfodata/linux-x86_64-test1.expected diff --git a/tests/nodeinfodata/linux-x86-test2.cpuinfo b/tests/nodeinfodata/linux-x86_64-test2.cpuinfo similarity index 100% rename from tests/nodeinfodata/linux-x86-test2.cpuinfo rename to tests/nodeinfodata/linux-x86_64-test2.cpuinfo diff --git a/tests/nodeinfodata/linux-x86-test2.expected b/tests/nodeinfodata/linux-x86_64-test2.expected similarity index 100% rename from tests/nodeinfodata/linux-x86-test2.expected rename to tests/nodeinfodata/linux-x86_64-test2.expected diff --git a/tests/nodeinfodata/linux-x86-test3.cpuinfo b/tests/nodeinfodata/linux-x86_64-test3.cpuinfo similarity index 100% rename from tests/nodeinfodata/linux-x86-test3.cpuinfo rename to tests/nodeinfodata/linux-x86_64-test3.cpuinfo diff --git a/tests/nodeinfodata/linux-x86-test3.expected b/tests/nodeinfodata/linux-x86_64-test3.expected similarity index 100% rename from tests/nodeinfodata/linux-x86-test3.expected rename to tests/nodeinfodata/linux-x86_64-test3.expected diff --git a/tests/nodeinfodata/linux-x86-test4.cpuinfo b/tests/nodeinfodata/linux-x86_64-test4.cpuinfo similarity index 100% rename from tests/nodeinfodata/linux-x86-test4.cpuinfo rename to tests/nodeinfodata/linux-x86_64-test4.cpuinfo diff --git a/tests/nodeinfodata/linux-x86-test4.expected b/tests/nodeinfodata/linux-x86_64-test4.expected similarity index 100% rename from tests/nodeinfodata/linux-x86-test4.expected rename to tests/nodeinfodata/linux-x86_64-test4.expected diff --git a/tests/nodeinfodata/linux-x86-test5.cpuinfo b/tests/nodeinfodata/linux-x86_64-test5.cpuinfo similarity index 100% rename from tests/nodeinfodata/linux-x86-test5.cpuinfo rename to tests/nodeinfodata/linux-x86_64-test5.cpuinfo diff --git a/tests/nodeinfodata/linux-x86-test5.expected b/tests/nodeinfodata/linux-x86_64-test5.expected similarity index 100% rename from tests/nodeinfodata/linux-x86-test5.expected rename to tests/nodeinfodata/linux-x86_64-test5.expected diff --git a/tests/nodeinfodata/linux-x86-test6.cpuinfo b/tests/nodeinfodata/linux-x86_64-test6.cpuinfo similarity index 100% rename from tests/nodeinfodata/linux-x86-test6.cpuinfo rename to tests/nodeinfodata/linux-x86_64-test6.cpuinfo diff --git a/tests/nodeinfodata/linux-x86-test6.expected b/tests/nodeinfodata/linux-x86_64-test6.expected similarity index 100% rename from tests/nodeinfodata/linux-x86-test6.expected rename to tests/nodeinfodata/linux-x86_64-test6.expected diff --git a/tests/nodeinfodata/linux-x86-test7.cpuinfo b/tests/nodeinfodata/linux-x86_64-test7.cpuinfo similarity index 100% rename from tests/nodeinfodata/linux-x86-test7.cpuinfo rename to tests/nodeinfodata/linux-x86_64-test7.cpuinfo diff --git a/tests/nodeinfodata/linux-x86-test7.expected b/tests/nodeinfodata/linux-x86_64-test7.expected similarity index 100% rename from tests/nodeinfodata/linux-x86-test7.expected rename to tests/nodeinfodata/linux-x86_64-test7.expected diff --git a/tests/nodeinfodata/linux-x86-test8.cpuinfo b/tests/nodeinfodata/linux-x86_64-test8.cpuinfo similarity index 100% rename from tests/nodeinfodata/linux-x86-test8.cpuinfo rename to tests/nodeinfodata/linux-x86_64-test8.cpuinfo diff --git a/tests/nodeinfodata/linux-x86-test8.expected b/tests/nodeinfodata/linux-x86_64-test8.expected similarity index 100% rename from tests/nodeinfodata/linux-x86-test8.expected rename to tests/nodeinfodata/linux-x86_64-test8.expected diff --git a/tests/nodeinfotest.c b/tests/nodeinfotest.c index a00a0b715960896b573f4205e4f0d4d1bf0bed08..f0b8196ef3ef32d8bd36ca9441955e0809f22b36 100644 --- a/tests/nodeinfotest.c +++ b/tests/nodeinfotest.c @@ -13,11 +13,7 @@ #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) @@ -30,6 +26,7 @@ main(void) static int linuxTestCompareFiles(const char *cpuinfofile, char *sysfs_dir, + virArch arch, const char *outputfile) { int ret = -1; @@ -46,7 +43,7 @@ linuxTestCompareFiles(const char *cpuinfofile, 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) @@ -167,31 +164,31 @@ linuxCPUStatsCompareFiles(const char *cpustatfile, } +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); @@ -235,25 +232,23 @@ mymain(void) { 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) \