Mercurial > hg > truffle
comparison src/os/solaris/vm/os_solaris.cpp @ 462:85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
Summary: In os::Linux::rebuild_cpu_to_node_map() fix the size of the CPU bitmap. Fixed arithmetic in MutableNUMASpace::adaptive_chunk_size() that could cause overflows and underflows of the chunk_size variable.
Reviewed-by: apetrusenko
author | iveresov |
---|---|
date | Wed, 03 Dec 2008 14:18:57 -0800 |
parents | 03f4fdd1b6af |
children | 24fda36852ce |
comparison
equal
deleted
inserted
replaced
457:27a80744a83b | 462:85f1b9537f70 |
---|---|
4636 os::Solaris::set_cond_destroy(::cond_destroy); | 4636 os::Solaris::set_cond_destroy(::cond_destroy); |
4637 } | 4637 } |
4638 } | 4638 } |
4639 } | 4639 } |
4640 | 4640 |
4641 void os::Solaris::liblgrp_init() { | 4641 bool os::Solaris::liblgrp_init() { |
4642 void *handle = dlopen("liblgrp.so.1", RTLD_LAZY); | 4642 void *handle = dlopen("liblgrp.so.1", RTLD_LAZY); |
4643 if (handle != NULL) { | 4643 if (handle != NULL) { |
4644 os::Solaris::set_lgrp_home(CAST_TO_FN_PTR(lgrp_home_func_t, dlsym(handle, "lgrp_home"))); | 4644 os::Solaris::set_lgrp_home(CAST_TO_FN_PTR(lgrp_home_func_t, dlsym(handle, "lgrp_home"))); |
4645 os::Solaris::set_lgrp_init(CAST_TO_FN_PTR(lgrp_init_func_t, dlsym(handle, "lgrp_init"))); | 4645 os::Solaris::set_lgrp_init(CAST_TO_FN_PTR(lgrp_init_func_t, dlsym(handle, "lgrp_init"))); |
4646 os::Solaris::set_lgrp_fini(CAST_TO_FN_PTR(lgrp_fini_func_t, dlsym(handle, "lgrp_fini"))); | 4646 os::Solaris::set_lgrp_fini(CAST_TO_FN_PTR(lgrp_fini_func_t, dlsym(handle, "lgrp_fini"))); |
4651 os::Solaris::set_lgrp_cookie_stale(CAST_TO_FN_PTR(lgrp_cookie_stale_func_t, | 4651 os::Solaris::set_lgrp_cookie_stale(CAST_TO_FN_PTR(lgrp_cookie_stale_func_t, |
4652 dlsym(handle, "lgrp_cookie_stale"))); | 4652 dlsym(handle, "lgrp_cookie_stale"))); |
4653 | 4653 |
4654 lgrp_cookie_t c = lgrp_init(LGRP_VIEW_CALLER); | 4654 lgrp_cookie_t c = lgrp_init(LGRP_VIEW_CALLER); |
4655 set_lgrp_cookie(c); | 4655 set_lgrp_cookie(c); |
4656 } else { | 4656 return true; |
4657 warning("your OS does not support NUMA"); | 4657 } |
4658 } | 4658 return false; |
4659 } | 4659 } |
4660 | 4660 |
4661 void os::Solaris::misc_sym_init() { | 4661 void os::Solaris::misc_sym_init() { |
4662 address func = (address)dlsym(RTLD_DEFAULT, "meminfo"); | 4662 address func = (address)dlsym(RTLD_DEFAULT, "meminfo"); |
4663 if(func == NULL) { | 4663 if(func == NULL) { |
4822 // the yellow/red zones can be guarded. | 4822 // the yellow/red zones can be guarded. |
4823 JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, | 4823 JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, |
4824 vm_page_size())); | 4824 vm_page_size())); |
4825 | 4825 |
4826 Solaris::libthread_init(); | 4826 Solaris::libthread_init(); |
4827 | |
4827 if (UseNUMA) { | 4828 if (UseNUMA) { |
4828 Solaris::liblgrp_init(); | 4829 if (!Solaris::liblgrp_init()) { |
4829 } | 4830 UseNUMA = false; |
4831 } else { | |
4832 size_t lgrp_limit = os::numa_get_groups_num(); | |
4833 int *lgrp_ids = NEW_C_HEAP_ARRAY(int, lgrp_limit); | |
4834 size_t lgrp_num = os::numa_get_leaf_groups(lgrp_ids, lgrp_limit); | |
4835 FREE_C_HEAP_ARRAY(int, lgrp_ids); | |
4836 if (lgrp_num < 2) { | |
4837 // There's only one locality group, disable NUMA. | |
4838 UseNUMA = false; | |
4839 } | |
4840 } | |
4841 if (!UseNUMA && ForceNUMA) { | |
4842 UseNUMA = true; | |
4843 } | |
4844 } | |
4845 | |
4830 Solaris::misc_sym_init(); | 4846 Solaris::misc_sym_init(); |
4831 Solaris::signal_sets_init(); | 4847 Solaris::signal_sets_init(); |
4832 Solaris::init_signal_mem(); | 4848 Solaris::init_signal_mem(); |
4833 Solaris::install_signal_handlers(); | 4849 Solaris::install_signal_handlers(); |
4834 | 4850 |