82 size_t alignment_hint, bool exec); 83 84 static void set_glibc_version(const char *s) { _glibc_version = s; } 85 static void set_libpthread_version(const char *s) { _libpthread_version = s; } 86 87 static void rebuild_cpu_to_node_map(); 88 static GrowableArray<int>* cpu_to_node() { return _cpu_to_node; } 89 90 static size_t find_large_page_size(); 91 static size_t setup_large_page_size(); 92 93 static bool setup_large_page_type(size_t page_size); 94 static bool transparent_huge_pages_sanity_check(bool warn, size_t pages_size); 95 static bool hugetlbfs_sanity_check(bool warn, size_t page_size); 96 97 static char* reserve_memory_special_shm(size_t bytes, size_t alignment, char* req_addr, bool exec); 98 static char* reserve_memory_special_huge_tlbfs(size_t bytes, size_t alignment, char* req_addr, bool exec); 99 static char* reserve_memory_special_huge_tlbfs_only(size_t bytes, char* req_addr, bool exec); 100 static char* reserve_memory_special_huge_tlbfs_mixed(size_t bytes, size_t alignment, char* req_addr, bool exec); 101 102 static bool release_memory_special_impl(char* base, size_t bytes); 103 static bool release_memory_special_shm(char* base, size_t bytes); 104 static bool release_memory_special_huge_tlbfs(char* base, size_t bytes); 105 106 static void print_full_memory_info(outputStream* st); 107 static void print_distro_info(outputStream* st); 108 static void print_libversion_info(outputStream* st); 109 110 public: 111 static bool _stack_is_executable; 112 static void *dlopen_helper(const char *name, char *ebuf, int ebuflen); 113 static void *dll_load_in_vmthread(const char *name, char *ebuf, int ebuflen); 114 115 static void init_thread_fpu_state(); 116 static int get_fpu_control_word(); 117 static void set_fpu_control_word(int fpu_control); 118 static pthread_t main_thread(void) { return _main_thread; } 119 // returns kernel thread id (similar to LWP id on Solaris), which can be 120 // used to access /proc 121 static pid_t gettid(); 232 typedef void (*numa_set_bind_policy_func_t)(int policy); 233 234 static sched_getcpu_func_t _sched_getcpu; 235 static numa_node_to_cpus_func_t _numa_node_to_cpus; 236 static numa_max_node_func_t _numa_max_node; 237 static numa_available_func_t _numa_available; 238 static numa_tonode_memory_func_t _numa_tonode_memory; 239 static numa_interleave_memory_func_t _numa_interleave_memory; 240 static numa_set_bind_policy_func_t _numa_set_bind_policy; 241 static unsigned long* _numa_all_nodes; 242 243 static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; } 244 static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; } 245 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; } 246 static void set_numa_available(numa_available_func_t func) { _numa_available = func; } 247 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; } 248 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; } 249 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; } 250 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; } 251 static int sched_getcpu_syscall(void); 252 public: 253 static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; } 254 static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) { 255 return _numa_node_to_cpus != NULL ? _numa_node_to_cpus(node, buffer, bufferlen) : -1; 256 } 257 static int numa_max_node() { return _numa_max_node != NULL ? _numa_max_node() : -1; } 258 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; } 259 static int numa_tonode_memory(void *start, size_t size, int node) { 260 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1; 261 } 262 static void numa_interleave_memory(void *start, size_t size) { 263 if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) { 264 _numa_interleave_memory(start, size, _numa_all_nodes); 265 } 266 } 267 static void numa_set_bind_policy(int policy) { 268 if (_numa_set_bind_policy != NULL) { 269 _numa_set_bind_policy(policy); 270 } 271 } | 82 size_t alignment_hint, bool exec); 83 84 static void set_glibc_version(const char *s) { _glibc_version = s; } 85 static void set_libpthread_version(const char *s) { _libpthread_version = s; } 86 87 static void rebuild_cpu_to_node_map(); 88 static GrowableArray<int>* cpu_to_node() { return _cpu_to_node; } 89 90 static size_t find_large_page_size(); 91 static size_t setup_large_page_size(); 92 93 static bool setup_large_page_type(size_t page_size); 94 static bool transparent_huge_pages_sanity_check(bool warn, size_t pages_size); 95 static bool hugetlbfs_sanity_check(bool warn, size_t page_size); 96 97 static char* reserve_memory_special_shm(size_t bytes, size_t alignment, char* req_addr, bool exec); 98 static char* reserve_memory_special_huge_tlbfs(size_t bytes, size_t alignment, char* req_addr, bool exec); 99 static char* reserve_memory_special_huge_tlbfs_only(size_t bytes, char* req_addr, bool exec); 100 static char* reserve_memory_special_huge_tlbfs_mixed(size_t bytes, size_t alignment, char* req_addr, bool exec); 101 102 static char* reserve_memory_with_backing_file(size_t bytes, char* requested_addr, 103 size_t alignment_hint, const char* backingFileDir); 104 105 static bool release_memory_special_impl(char* base, size_t bytes); 106 static bool release_memory_special_shm(char* base, size_t bytes); 107 static bool release_memory_special_huge_tlbfs(char* base, size_t bytes); 108 109 static void print_full_memory_info(outputStream* st); 110 static void print_distro_info(outputStream* st); 111 static void print_libversion_info(outputStream* st); 112 113 public: 114 static bool _stack_is_executable; 115 static void *dlopen_helper(const char *name, char *ebuf, int ebuflen); 116 static void *dll_load_in_vmthread(const char *name, char *ebuf, int ebuflen); 117 118 static void init_thread_fpu_state(); 119 static int get_fpu_control_word(); 120 static void set_fpu_control_word(int fpu_control); 121 static pthread_t main_thread(void) { return _main_thread; } 122 // returns kernel thread id (similar to LWP id on Solaris), which can be 123 // used to access /proc 124 static pid_t gettid(); 235 typedef void (*numa_set_bind_policy_func_t)(int policy); 236 237 static sched_getcpu_func_t _sched_getcpu; 238 static numa_node_to_cpus_func_t _numa_node_to_cpus; 239 static numa_max_node_func_t _numa_max_node; 240 static numa_available_func_t _numa_available; 241 static numa_tonode_memory_func_t _numa_tonode_memory; 242 static numa_interleave_memory_func_t _numa_interleave_memory; 243 static numa_set_bind_policy_func_t _numa_set_bind_policy; 244 static unsigned long* _numa_all_nodes; 245 246 static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; } 247 static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; } 248 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; } 249 static void set_numa_available(numa_available_func_t func) { _numa_available = func; } 250 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; } 251 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; } 252 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; } 253 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; } 254 static int sched_getcpu_syscall(void); 255 256 static int create_tmpfile(const char* dir, size_t size, bool exec); 257 static char* reserve_memory_with_backing_file_aligned(size_t size, size_t alignment, int fd); 258 static char* reserve_memory_with_backing_file_at(size_t bytes, char* requested_addr, int fd); 259 260 261 public: 262 static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; } 263 static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) { 264 return _numa_node_to_cpus != NULL ? _numa_node_to_cpus(node, buffer, bufferlen) : -1; 265 } 266 static int numa_max_node() { return _numa_max_node != NULL ? _numa_max_node() : -1; } 267 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; } 268 static int numa_tonode_memory(void *start, size_t size, int node) { 269 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1; 270 } 271 static void numa_interleave_memory(void *start, size_t size) { 272 if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) { 273 _numa_interleave_memory(start, size, _numa_all_nodes); 274 } 275 } 276 static void numa_set_bind_policy(int policy) { 277 if (_numa_set_bind_policy != NULL) { 278 _numa_set_bind_policy(policy); 279 } 280 } |