From ae6b5da3d17cecfe50a75ee82ae11d075229cd9e Mon Sep 17 00:00:00 2001 From: Ryota Ozaki Date: Mon, 21 Oct 2013 00:14:52 +0900 Subject: [PATCH] nodeinfo: fix physical memory size on Mac OS X HW_PHYSMEM is available on Mac OS X as well as FreeBSD, however, its resulting value for Mac OS X is 32 bits. Mac OS X provides HW_MEMSIZE that is 64 bits version of HW_PHYSMEM. We have to use it. I tested the patch on Mac OS X 10.6.8, 10.7.4, 10.8.5 and FreeBSD 9.2. Signed-off-by: Ryota Ozaki --- src/nodeinfo.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/nodeinfo.c b/src/nodeinfo.c index 70814c25e5..a0fdfe7d63 100644 --- a/src/nodeinfo.c +++ b/src/nodeinfo.c @@ -73,6 +73,33 @@ appleFreebsdNodeGetCPUCount(void) return ncpu; } + +/* VIR_HW_PHYSMEM - the resulting value of HW_PHYSMEM of FreeBSD + * is 64 bits while that of Mac OS X is still 32 bits. + * Mac OS X provides HW_MEMSIZE for 64 bits version of HW_PHYSMEM + * since 10.6.8 (Snow Leopard) at least. + */ +# ifdef HW_MEMSIZE +# define VIR_HW_PHYSMEM HW_MEMSIZE +# else +# define VIR_HW_PHYSMEM HW_PHYSMEM +# endif +static int +appleFreebsdNodeGetMemorySize(unsigned long *memory) +{ + int mib[2] = { CTL_HW, VIR_HW_PHYSMEM }; + unsigned long physmem; + size_t len = sizeof(physmem); + + if (sysctl(mib, 2, &physmem, &len, NULL, 0) == -1) { + virReportSystemError(errno, "%s", _("cannot obtain memory size")); + return -1; + } + + *memory = (unsigned long)(physmem / 1024); + + return 0; +} #endif #ifdef __linux__ @@ -914,17 +941,8 @@ cleanup: nodeinfo->mhz = cpu_freq / 1000000; # endif - /* get memory information */ - int mib[2] = { CTL_HW, HW_PHYSMEM }; - unsigned long physmem; - size_t len = sizeof(physmem); - - if (sysctl(mib, 2, &physmem, &len, NULL, 0) == -1) { - virReportSystemError(errno, "%s", _("cannot obtain memory size")); + if (appleFreebsdNodeGetMemorySize(&nodeinfo->memory) < 0) return -1; - } - - nodeinfo->memory = (unsigned long)(physmem / 1024); return 0; } -- GitLab