]> xenbits.xensource.com Git - libvirt.git/commitdiff
nodeinfo: fix physical memory size on Mac OS X
authorRyota Ozaki <ozaki.ryota@gmail.com>
Sun, 20 Oct 2013 15:14:52 +0000 (00:14 +0900)
committerDoug Goldstein <cardoe@cardoe.com>
Tue, 22 Oct 2013 04:45:28 +0000 (23:45 -0500)
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 <ozaki.ryota@gmail.com>
src/nodeinfo.c

index 70814c25e5bd54739bdcc5f5c656ee2a1c7c0d98..a0fdfe7d63a16b5471f03ddea11bcf1d638318fe 100644 (file)
@@ -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;
     }