8006431: os::Bsd::initialize_system_info() sets _physical_memory too large

Use HW_MEMSIZE instead of HW_USERMEM to get a 64 bit value of the physical memory on the machine. Also reviewed by vitalyd@gmail.com.

Reviewed-by: sla, dholmes, dlong, mikael
This commit is contained in:
Bengt Rutisson 2013-01-21 09:00:04 +01:00
parent 833b7fcfff
commit cfbcddfb0f

View file

@ -243,29 +243,32 @@ void os::Bsd::initialize_system_info() {
int mib[2]; int mib[2];
size_t len; size_t len;
int cpu_val; int cpu_val;
u_long mem_val; julong mem_val;
/* get processors count via hw.ncpus sysctl */ /* get processors count via hw.ncpus sysctl */
mib[0] = CTL_HW; mib[0] = CTL_HW;
mib[1] = HW_NCPU; mib[1] = HW_NCPU;
len = sizeof(cpu_val); len = sizeof(cpu_val);
if (sysctl(mib, 2, &cpu_val, &len, NULL, 0) != -1 && cpu_val >= 1) { if (sysctl(mib, 2, &cpu_val, &len, NULL, 0) != -1 && cpu_val >= 1) {
assert(len == sizeof(cpu_val), "unexpected data size");
set_processor_count(cpu_val); set_processor_count(cpu_val);
} }
else { else {
set_processor_count(1); // fallback set_processor_count(1); // fallback
} }
/* get physical memory via hw.usermem sysctl (hw.usermem is used /* get physical memory via hw.memsize sysctl (hw.memsize is used
* instead of hw.physmem because we need size of allocatable memory * since it returns a 64 bit value)
*/ */
mib[0] = CTL_HW; mib[0] = CTL_HW;
mib[1] = HW_USERMEM; mib[1] = HW_MEMSIZE;
len = sizeof(mem_val); len = sizeof(mem_val);
if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1) if (sysctl(mib, 2, &mem_val, &len, NULL, 0) != -1) {
assert(len == sizeof(mem_val), "unexpected data size");
_physical_memory = mem_val; _physical_memory = mem_val;
else } else {
_physical_memory = 256*1024*1024; // fallback (XXXBSD?) _physical_memory = 256*1024*1024; // fallback (XXXBSD?)
}
#ifdef __OpenBSD__ #ifdef __OpenBSD__
{ {