188 static bool is_floating_stack() { return _is_floating_stack; } |
188 static bool is_floating_stack() { return _is_floating_stack; } |
189 |
189 |
190 static void libpthread_init(); |
190 static void libpthread_init(); |
191 static bool libnuma_init(); |
191 static bool libnuma_init(); |
192 static void* libnuma_dlsym(void* handle, const char* name); |
192 static void* libnuma_dlsym(void* handle, const char* name); |
|
193 // libnuma v2 (libnuma_1.2) symbols |
|
194 static void* libnuma_v2_dlsym(void* handle, const char* name); |
193 // Minimum stack size a thread can be created with (allowing |
195 // Minimum stack size a thread can be created with (allowing |
194 // the VM to completely create the thread and enter user code) |
196 // the VM to completely create the thread and enter user code) |
195 static size_t min_stack_allowed; |
197 static size_t min_stack_allowed; |
196 |
198 |
197 // Return default stack size or guard size for the specified thread type |
199 // Return default stack size or guard size for the specified thread type |
248 typedef int (*numa_max_node_func_t)(void); |
250 typedef int (*numa_max_node_func_t)(void); |
249 typedef int (*numa_num_configured_nodes_func_t)(void); |
251 typedef int (*numa_num_configured_nodes_func_t)(void); |
250 typedef int (*numa_available_func_t)(void); |
252 typedef int (*numa_available_func_t)(void); |
251 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node); |
253 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node); |
252 typedef void (*numa_interleave_memory_func_t)(void *start, size_t size, unsigned long *nodemask); |
254 typedef void (*numa_interleave_memory_func_t)(void *start, size_t size, unsigned long *nodemask); |
|
255 typedef void (*numa_interleave_memory_v2_func_t)(void *start, size_t size, struct bitmask* mask); |
|
256 |
253 typedef void (*numa_set_bind_policy_func_t)(int policy); |
257 typedef void (*numa_set_bind_policy_func_t)(int policy); |
254 typedef int (*numa_bitmask_isbitset_func_t)(struct bitmask *bmp, unsigned int n); |
258 typedef int (*numa_bitmask_isbitset_func_t)(struct bitmask *bmp, unsigned int n); |
255 typedef int (*numa_distance_func_t)(int node1, int node2); |
259 typedef int (*numa_distance_func_t)(int node1, int node2); |
256 |
260 |
257 static sched_getcpu_func_t _sched_getcpu; |
261 static sched_getcpu_func_t _sched_getcpu; |
259 static numa_max_node_func_t _numa_max_node; |
263 static numa_max_node_func_t _numa_max_node; |
260 static numa_num_configured_nodes_func_t _numa_num_configured_nodes; |
264 static numa_num_configured_nodes_func_t _numa_num_configured_nodes; |
261 static numa_available_func_t _numa_available; |
265 static numa_available_func_t _numa_available; |
262 static numa_tonode_memory_func_t _numa_tonode_memory; |
266 static numa_tonode_memory_func_t _numa_tonode_memory; |
263 static numa_interleave_memory_func_t _numa_interleave_memory; |
267 static numa_interleave_memory_func_t _numa_interleave_memory; |
|
268 static numa_interleave_memory_v2_func_t _numa_interleave_memory_v2; |
264 static numa_set_bind_policy_func_t _numa_set_bind_policy; |
269 static numa_set_bind_policy_func_t _numa_set_bind_policy; |
265 static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset; |
270 static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset; |
266 static numa_distance_func_t _numa_distance; |
271 static numa_distance_func_t _numa_distance; |
267 static unsigned long* _numa_all_nodes; |
272 static unsigned long* _numa_all_nodes; |
268 static struct bitmask* _numa_all_nodes_ptr; |
273 static struct bitmask* _numa_all_nodes_ptr; |
273 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; } |
278 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; } |
274 static void set_numa_num_configured_nodes(numa_num_configured_nodes_func_t func) { _numa_num_configured_nodes = func; } |
279 static void set_numa_num_configured_nodes(numa_num_configured_nodes_func_t func) { _numa_num_configured_nodes = func; } |
275 static void set_numa_available(numa_available_func_t func) { _numa_available = func; } |
280 static void set_numa_available(numa_available_func_t func) { _numa_available = func; } |
276 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; } |
281 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; } |
277 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; } |
282 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; } |
|
283 static void set_numa_interleave_memory_v2(numa_interleave_memory_v2_func_t func) { _numa_interleave_memory_v2 = func; } |
278 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; } |
284 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; } |
279 static void set_numa_bitmask_isbitset(numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; } |
285 static void set_numa_bitmask_isbitset(numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; } |
280 static void set_numa_distance(numa_distance_func_t func) { _numa_distance = func; } |
286 static void set_numa_distance(numa_distance_func_t func) { _numa_distance = func; } |
281 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; } |
287 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; } |
282 static void set_numa_all_nodes_ptr(struct bitmask **ptr) { _numa_all_nodes_ptr = *ptr; } |
288 static void set_numa_all_nodes_ptr(struct bitmask **ptr) { _numa_all_nodes_ptr = *ptr; } |
294 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; } |
300 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; } |
295 static int numa_tonode_memory(void *start, size_t size, int node) { |
301 static int numa_tonode_memory(void *start, size_t size, int node) { |
296 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1; |
302 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1; |
297 } |
303 } |
298 static void numa_interleave_memory(void *start, size_t size) { |
304 static void numa_interleave_memory(void *start, size_t size) { |
299 if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) { |
305 // Use v2 api if available |
|
306 if (_numa_interleave_memory_v2 != NULL && _numa_all_nodes_ptr != NULL) { |
|
307 _numa_interleave_memory_v2(start, size, _numa_all_nodes_ptr); |
|
308 } else if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) { |
300 _numa_interleave_memory(start, size, _numa_all_nodes); |
309 _numa_interleave_memory(start, size, _numa_all_nodes); |
301 } |
310 } |
302 } |
311 } |
303 static void numa_set_bind_policy(int policy) { |
312 static void numa_set_bind_policy(int policy) { |
304 if (_numa_set_bind_policy != NULL) { |
313 if (_numa_set_bind_policy != NULL) { |