The gnulib's physmem_total will as a fallback report 64MB as total memory if sysconf(_SC_PHYS_PAGES) is unimplemented on linux. This makes it impossible to detect if physmem_total works or not, so we try first the linux only sysinfo(2) before falling back to gnulibs physmem_total. This makes the total memory be correctly reported on musl libc and uclibc. Signed-off-by: Natanael Copa <ncopa@xxxxxxxxxxxxxxx> --- configure.ac | 2 +- src/nodeinfo.c | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index 52c50df..32a2e5a 100644 --- a/configure.ac +++ b/configure.ac @@ -310,7 +310,7 @@ dnl Availability of various common headers (non-fatal if missing). AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/un.h \ sys/poll.h syslog.h mntent.h net/ethernet.h linux/magic.h \ sys/un.h sys/syscall.h sys/sysctl.h netinet/tcp.h ifaddrs.h \ - libtasn1.h sys/ucred.h sys/mount.h]) + libtasn1.h sys/ucred.h sys/mount.h sys/sysinfo.h]) dnl Check whether endian provides handy macros. AC_CHECK_DECLS([htole64], [], [], [[#include <endian.h>]]) diff --git a/src/nodeinfo.c b/src/nodeinfo.c index c88f86c..3c76f54 100644 --- a/src/nodeinfo.c +++ b/src/nodeinfo.c @@ -40,6 +40,10 @@ # include <sys/resource.h> #endif +#if HAVE_SYS_SYSINFO_H +# include <sys/sysinfo.h> +#endif + #include "c-ctype.h" #include "viralloc.h" #include "nodeinfopriv.h" @@ -1041,7 +1045,18 @@ int nodeGetInfo(virNodeInfoPtr nodeinfo) #ifdef __linux__ { int ret = -1; - FILE *cpuinfo = fopen(CPUINFO_PATH, "r"); + FILE *cpuinfo; +#if HAVE_SYS_SYSINFO_H + struct sysinfo si; + + /* Convert to KB. */ + if (sysinfo(&si) == 0) { + nodeinfo->memory = si.totalram / 1024; + } else +#endif + nodeinfo->memory = physmem_total() / 1024; + + cpuinfo = fopen(CPUINFO_PATH, "r"); if (!cpuinfo) { virReportSystemError(errno, _("cannot open %s"), CPUINFO_PATH); @@ -1049,11 +1064,6 @@ int nodeGetInfo(virNodeInfoPtr nodeinfo) } ret = linuxNodeInfoCPUPopulate(cpuinfo, SYSFS_SYSTEM_PATH, nodeinfo); - if (ret < 0) - goto cleanup; - - /* Convert to KB. */ - nodeinfo->memory = physmem_total() / 1024; cleanup: VIR_FORCE_FCLOSE(cpuinfo); -- 1.9.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list