170 static const char *libpthread_version() { return _libpthread_version; } |
170 static const char *libpthread_version() { return _libpthread_version; } |
171 |
171 |
172 static void libpthread_init(); |
172 static void libpthread_init(); |
173 static bool libnuma_init(); |
173 static bool libnuma_init(); |
174 static void* libnuma_dlsym(void* handle, const char* name); |
174 static void* libnuma_dlsym(void* handle, const char* name); |
|
175 // libnuma v2 (libnuma_1.2) symbols |
|
176 static void* libnuma_v2_dlsym(void* handle, const char* name); |
175 |
177 |
176 // Return default guard size for the specified thread type |
178 // Return default guard size for the specified thread type |
177 static size_t default_guard_size(os::ThreadType thr_type); |
179 static size_t default_guard_size(os::ThreadType thr_type); |
178 |
180 |
179 static void capture_initial_stack(size_t max_size); |
181 static void capture_initial_stack(size_t max_size); |
216 typedef int (*numa_max_node_func_t)(void); |
218 typedef int (*numa_max_node_func_t)(void); |
217 typedef int (*numa_num_configured_nodes_func_t)(void); |
219 typedef int (*numa_num_configured_nodes_func_t)(void); |
218 typedef int (*numa_available_func_t)(void); |
220 typedef int (*numa_available_func_t)(void); |
219 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node); |
221 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node); |
220 typedef void (*numa_interleave_memory_func_t)(void *start, size_t size, unsigned long *nodemask); |
222 typedef void (*numa_interleave_memory_func_t)(void *start, size_t size, unsigned long *nodemask); |
|
223 typedef void (*numa_interleave_memory_v2_func_t)(void *start, size_t size, struct bitmask* mask); |
|
224 |
221 typedef void (*numa_set_bind_policy_func_t)(int policy); |
225 typedef void (*numa_set_bind_policy_func_t)(int policy); |
222 typedef int (*numa_bitmask_isbitset_func_t)(struct bitmask *bmp, unsigned int n); |
226 typedef int (*numa_bitmask_isbitset_func_t)(struct bitmask *bmp, unsigned int n); |
223 typedef int (*numa_distance_func_t)(int node1, int node2); |
227 typedef int (*numa_distance_func_t)(int node1, int node2); |
224 |
228 |
225 static sched_getcpu_func_t _sched_getcpu; |
229 static sched_getcpu_func_t _sched_getcpu; |
227 static numa_max_node_func_t _numa_max_node; |
231 static numa_max_node_func_t _numa_max_node; |
228 static numa_num_configured_nodes_func_t _numa_num_configured_nodes; |
232 static numa_num_configured_nodes_func_t _numa_num_configured_nodes; |
229 static numa_available_func_t _numa_available; |
233 static numa_available_func_t _numa_available; |
230 static numa_tonode_memory_func_t _numa_tonode_memory; |
234 static numa_tonode_memory_func_t _numa_tonode_memory; |
231 static numa_interleave_memory_func_t _numa_interleave_memory; |
235 static numa_interleave_memory_func_t _numa_interleave_memory; |
|
236 static numa_interleave_memory_v2_func_t _numa_interleave_memory_v2; |
232 static numa_set_bind_policy_func_t _numa_set_bind_policy; |
237 static numa_set_bind_policy_func_t _numa_set_bind_policy; |
233 static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset; |
238 static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset; |
234 static numa_distance_func_t _numa_distance; |
239 static numa_distance_func_t _numa_distance; |
235 static unsigned long* _numa_all_nodes; |
240 static unsigned long* _numa_all_nodes; |
236 static struct bitmask* _numa_all_nodes_ptr; |
241 static struct bitmask* _numa_all_nodes_ptr; |
241 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; } |
246 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; } |
242 static void set_numa_num_configured_nodes(numa_num_configured_nodes_func_t func) { _numa_num_configured_nodes = func; } |
247 static void set_numa_num_configured_nodes(numa_num_configured_nodes_func_t func) { _numa_num_configured_nodes = func; } |
243 static void set_numa_available(numa_available_func_t func) { _numa_available = func; } |
248 static void set_numa_available(numa_available_func_t func) { _numa_available = func; } |
244 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; } |
249 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; } |
245 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; } |
250 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; } |
|
251 static void set_numa_interleave_memory_v2(numa_interleave_memory_v2_func_t func) { _numa_interleave_memory_v2 = func; } |
246 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; } |
252 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; } |
247 static void set_numa_bitmask_isbitset(numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; } |
253 static void set_numa_bitmask_isbitset(numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; } |
248 static void set_numa_distance(numa_distance_func_t func) { _numa_distance = func; } |
254 static void set_numa_distance(numa_distance_func_t func) { _numa_distance = func; } |
249 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; } |
255 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; } |
250 static void set_numa_all_nodes_ptr(struct bitmask **ptr) { _numa_all_nodes_ptr = *ptr; } |
256 static void set_numa_all_nodes_ptr(struct bitmask **ptr) { _numa_all_nodes_ptr = *ptr; } |
262 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; } |
268 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; } |
263 static int numa_tonode_memory(void *start, size_t size, int node) { |
269 static int numa_tonode_memory(void *start, size_t size, int node) { |
264 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1; |
270 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1; |
265 } |
271 } |
266 static void numa_interleave_memory(void *start, size_t size) { |
272 static void numa_interleave_memory(void *start, size_t size) { |
267 if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) { |
273 // Use v2 api if available |
|
274 if (_numa_interleave_memory_v2 != NULL && _numa_all_nodes_ptr != NULL) { |
|
275 _numa_interleave_memory_v2(start, size, _numa_all_nodes_ptr); |
|
276 } else if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) { |
268 _numa_interleave_memory(start, size, _numa_all_nodes); |
277 _numa_interleave_memory(start, size, _numa_all_nodes); |
269 } |
278 } |
270 } |
279 } |
271 static void numa_set_bind_policy(int policy) { |
280 static void numa_set_bind_policy(int policy) { |
272 if (_numa_set_bind_policy != NULL) { |
281 if (_numa_set_bind_policy != NULL) { |