nodeinfo: enable nodeGetCPUCount for older kernels

Since /sys/devices/system/cpu/present is not available on
older kernels like on RHEL 5.x nodeGetCPUCount will
fail there. The fallback implemented is to scan for
/sys/devices/system/cpu/cpuNN entries.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
This commit is contained in:
Viktor Mihajlovski 2012-11-13 13:54:36 +01:00 committed by Eric Blake
parent 39c814ff46
commit 0c996c10e4

View File

@ -978,11 +978,35 @@ int
nodeGetCPUCount(void)
{
#ifdef __linux__
/* XXX should we also work on older kernels, like RHEL5, that lack
* cpu/present and cpu/online files? Those kernels also lack cpu
* hotplugging, so it would be a matter of finding the largest
* cpu/cpuNN directory, and returning NN + 1 */
return linuxParseCPUmax(SYSFS_SYSTEM_PATH "/cpu/present");
/* To support older kernels that lack cpu/present, such as 2.6.18
* in RHEL5, we fall back to count cpu/cpuNN entries; this assumes
* that such kernels also lack hotplug, and therefore cpu/cpuNN
* will be consecutive.
*/
char *cpupath = NULL;
int i = 0;
if (virFileExists(SYSFS_SYSTEM_PATH "/cpu/present")) {
i = linuxParseCPUmax(SYSFS_SYSTEM_PATH "/cpu/present");
} else if (virFileExists(SYSFS_SYSTEM_PATH "/cpu/cpu0")) {
do {
i++;
VIR_FREE(cpupath);
if (virAsprintf(&cpupath, "%s/cpu/cpu%d",
SYSFS_SYSTEM_PATH, i) < 0) {
virReportOOMError();
return -1;
}
} while (virFileExists(cpupath));
} else {
/* no cpu/cpu0: we give up */
virReportError(VIR_ERR_NO_SUPPORT, "%s",
_("host cpu counting not supported on this node"));
return -1;
}
VIR_FREE(cpupath);
return i;
#else
virReportError(VIR_ERR_NO_SUPPORT, "%s",
_("host cpu counting not implemented on this platform"));