< prev index next >

src/os/linux/vm/os_linux.hpp

Print this page
rev 8276 : 8181055: PPC64: "mbind: Invalid argument" still seen after 8175813
Summary: Use numa_interleave_memory v2 api when available
Reviewed-by: dholmes, shade, gromero


 173 
 174   // For signal-chaining
 175   static struct sigaction *get_chained_signal_action(int sig);
 176   static bool chained_handler(int sig, siginfo_t* siginfo, void* context);
 177 
 178   // GNU libc and libpthread version strings
 179   static const char *glibc_version()          { return _glibc_version; }
 180   static const char *libpthread_version()     { return _libpthread_version; }
 181 
 182   // NPTL or LinuxThreads?
 183   static bool is_LinuxThreads()               { return !_is_NPTL; }
 184   static bool is_NPTL()                       { return _is_NPTL;  }
 185 
 186   // NPTL is always floating stack. LinuxThreads could be using floating
 187   // stack or fixed stack.
 188   static bool is_floating_stack()             { return _is_floating_stack; }
 189 
 190   static void libpthread_init();
 191   static bool libnuma_init();
 192   static void* libnuma_dlsym(void* handle, const char* name);


 193   // Minimum stack size a thread can be created with (allowing
 194   // the VM to completely create the thread and enter user code)
 195   static size_t min_stack_allowed;
 196 
 197   // Return default stack size or guard size for the specified thread type
 198   static size_t default_stack_size(os::ThreadType thr_type);
 199   static size_t default_guard_size(os::ThreadType thr_type);
 200 
 201   static void capture_initial_stack(size_t max_size);
 202 
 203   // Stack overflow handling
 204   static bool manually_expand_stack(JavaThread * t, address addr);
 205   static int max_register_window_saves_before_flushing();
 206 
 207   // Real-time clock functions
 208   static void clock_init(void);
 209 
 210   // fast POSIX clocks support
 211   static void fast_thread_clock_init(void);
 212 


 233   static pthread_condattr_t _condattr[1];
 234 
 235   public:
 236   static pthread_condattr_t* condAttr() { return _condattr; }
 237 
 238   // Stack repair handling
 239 
 240   // none present
 241 
 242   // LinuxThreads work-around for 6292965
 243   static int safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime);
 244 
 245 private:
 246   typedef int (*sched_getcpu_func_t)(void);
 247   typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen);
 248   typedef int (*numa_max_node_func_t)(void);
 249   typedef int (*numa_num_configured_nodes_func_t)(void);
 250   typedef int (*numa_available_func_t)(void);
 251   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);


 253   typedef void (*numa_set_bind_policy_func_t)(int policy);
 254   typedef int (*numa_bitmask_isbitset_func_t)(struct bitmask *bmp, unsigned int n);
 255   typedef int (*numa_distance_func_t)(int node1, int node2);
 256 
 257   static sched_getcpu_func_t _sched_getcpu;
 258   static numa_node_to_cpus_func_t _numa_node_to_cpus;
 259   static numa_max_node_func_t _numa_max_node;
 260   static numa_num_configured_nodes_func_t _numa_num_configured_nodes;
 261   static numa_available_func_t _numa_available;
 262   static numa_tonode_memory_func_t _numa_tonode_memory;
 263   static numa_interleave_memory_func_t _numa_interleave_memory;

 264   static numa_set_bind_policy_func_t _numa_set_bind_policy;
 265   static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset;
 266   static numa_distance_func_t _numa_distance;
 267   static unsigned long* _numa_all_nodes;
 268   static struct bitmask* _numa_all_nodes_ptr;
 269   static struct bitmask* _numa_nodes_ptr;
 270 
 271   static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; }
 272   static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; }
 273   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; }
 275   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; }
 277   static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; }

 278   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; }
 280   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; }
 282   static void set_numa_all_nodes_ptr(struct bitmask **ptr) { _numa_all_nodes_ptr = *ptr; }
 283   static void set_numa_nodes_ptr(struct bitmask **ptr) { _numa_nodes_ptr = *ptr; }
 284   static int sched_getcpu_syscall(void);
 285 public:
 286   static int sched_getcpu()  { return _sched_getcpu != NULL ? _sched_getcpu() : -1; }
 287   static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) {
 288     return _numa_node_to_cpus != NULL ? _numa_node_to_cpus(node, buffer, bufferlen) : -1;
 289   }
 290   static int numa_max_node() { return _numa_max_node != NULL ? _numa_max_node() : -1; }
 291   static int numa_num_configured_nodes() {
 292     return _numa_num_configured_nodes != NULL ? _numa_num_configured_nodes() : -1;
 293   }
 294   static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; }
 295   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;
 297   }
 298   static void numa_interleave_memory(void *start, size_t size) {
 299     if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) {



 300       _numa_interleave_memory(start, size, _numa_all_nodes);
 301     }
 302   }
 303   static void numa_set_bind_policy(int policy) {
 304     if (_numa_set_bind_policy != NULL) {
 305       _numa_set_bind_policy(policy);
 306     }
 307   }
 308   static int numa_distance(int node1, int node2) {
 309     return _numa_distance != NULL ? _numa_distance(node1, node2) : -1;
 310   }
 311   static int get_node_by_cpu(int cpu_id);
 312   static int get_existing_num_nodes();
 313   // Check if numa node is configured (non-zero memory node).
 314   static bool isnode_in_configured_nodes(unsigned int n) {
 315     if (_numa_bitmask_isbitset != NULL && _numa_all_nodes_ptr != NULL) {
 316       return _numa_bitmask_isbitset(_numa_all_nodes_ptr, n);
 317     } else
 318       return 0;
 319   }




 173 
 174   // For signal-chaining
 175   static struct sigaction *get_chained_signal_action(int sig);
 176   static bool chained_handler(int sig, siginfo_t* siginfo, void* context);
 177 
 178   // GNU libc and libpthread version strings
 179   static const char *glibc_version()          { return _glibc_version; }
 180   static const char *libpthread_version()     { return _libpthread_version; }
 181 
 182   // NPTL or LinuxThreads?
 183   static bool is_LinuxThreads()               { return !_is_NPTL; }
 184   static bool is_NPTL()                       { return _is_NPTL;  }
 185 
 186   // NPTL is always floating stack. LinuxThreads could be using floating
 187   // stack or fixed stack.
 188   static bool is_floating_stack()             { return _is_floating_stack; }
 189 
 190   static void libpthread_init();
 191   static bool libnuma_init();
 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);
 195   // Minimum stack size a thread can be created with (allowing
 196   // the VM to completely create the thread and enter user code)
 197   static size_t min_stack_allowed;
 198 
 199   // Return default stack size or guard size for the specified thread type
 200   static size_t default_stack_size(os::ThreadType thr_type);
 201   static size_t default_guard_size(os::ThreadType thr_type);
 202 
 203   static void capture_initial_stack(size_t max_size);
 204 
 205   // Stack overflow handling
 206   static bool manually_expand_stack(JavaThread * t, address addr);
 207   static int max_register_window_saves_before_flushing();
 208 
 209   // Real-time clock functions
 210   static void clock_init(void);
 211 
 212   // fast POSIX clocks support
 213   static void fast_thread_clock_init(void);
 214 


 235   static pthread_condattr_t _condattr[1];
 236 
 237   public:
 238   static pthread_condattr_t* condAttr() { return _condattr; }
 239 
 240   // Stack repair handling
 241 
 242   // none present
 243 
 244   // LinuxThreads work-around for 6292965
 245   static int safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime);
 246 
 247 private:
 248   typedef int (*sched_getcpu_func_t)(void);
 249   typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen);
 250   typedef int (*numa_max_node_func_t)(void);
 251   typedef int (*numa_num_configured_nodes_func_t)(void);
 252   typedef int (*numa_available_func_t)(void);
 253   typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node);
 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 
 257   typedef void (*numa_set_bind_policy_func_t)(int policy);
 258   typedef int (*numa_bitmask_isbitset_func_t)(struct bitmask *bmp, unsigned int n);
 259   typedef int (*numa_distance_func_t)(int node1, int node2);
 260 
 261   static sched_getcpu_func_t _sched_getcpu;
 262   static numa_node_to_cpus_func_t _numa_node_to_cpus;
 263   static numa_max_node_func_t _numa_max_node;
 264   static numa_num_configured_nodes_func_t _numa_num_configured_nodes;
 265   static numa_available_func_t _numa_available;
 266   static numa_tonode_memory_func_t _numa_tonode_memory;
 267   static numa_interleave_memory_func_t _numa_interleave_memory;
 268   static numa_interleave_memory_v2_func_t _numa_interleave_memory_v2;
 269   static numa_set_bind_policy_func_t _numa_set_bind_policy;
 270   static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset;
 271   static numa_distance_func_t _numa_distance;
 272   static unsigned long* _numa_all_nodes;
 273   static struct bitmask* _numa_all_nodes_ptr;
 274   static struct bitmask* _numa_nodes_ptr;
 275 
 276   static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; }
 277   static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; }
 278   static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; }
 279   static void set_numa_num_configured_nodes(numa_num_configured_nodes_func_t func) { _numa_num_configured_nodes = func; }
 280   static void set_numa_available(numa_available_func_t func) { _numa_available = func; }
 281   static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_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; }
 284   static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; }
 285   static void set_numa_bitmask_isbitset(numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; }
 286   static void set_numa_distance(numa_distance_func_t func) { _numa_distance = func; }
 287   static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; }
 288   static void set_numa_all_nodes_ptr(struct bitmask **ptr) { _numa_all_nodes_ptr = *ptr; }
 289   static void set_numa_nodes_ptr(struct bitmask **ptr) { _numa_nodes_ptr = *ptr; }
 290   static int sched_getcpu_syscall(void);
 291 public:
 292   static int sched_getcpu()  { return _sched_getcpu != NULL ? _sched_getcpu() : -1; }
 293   static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) {
 294     return _numa_node_to_cpus != NULL ? _numa_node_to_cpus(node, buffer, bufferlen) : -1;
 295   }
 296   static int numa_max_node() { return _numa_max_node != NULL ? _numa_max_node() : -1; }
 297   static int numa_num_configured_nodes() {
 298     return _numa_num_configured_nodes != NULL ? _numa_num_configured_nodes() : -1;
 299   }
 300   static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; }
 301   static int numa_tonode_memory(void *start, size_t size, int node) {
 302     return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1;
 303   }
 304   static void numa_interleave_memory(void *start, size_t size) {
 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) {
 309       _numa_interleave_memory(start, size, _numa_all_nodes);
 310     }
 311   }
 312   static void numa_set_bind_policy(int policy) {
 313     if (_numa_set_bind_policy != NULL) {
 314       _numa_set_bind_policy(policy);
 315     }
 316   }
 317   static int numa_distance(int node1, int node2) {
 318     return _numa_distance != NULL ? _numa_distance(node1, node2) : -1;
 319   }
 320   static int get_node_by_cpu(int cpu_id);
 321   static int get_existing_num_nodes();
 322   // Check if numa node is configured (non-zero memory node).
 323   static bool isnode_in_configured_nodes(unsigned int n) {
 324     if (_numa_bitmask_isbitset != NULL && _numa_all_nodes_ptr != NULL) {
 325       return _numa_bitmask_isbitset(_numa_all_nodes_ptr, n);
 326     } else
 327       return 0;
 328   }


< prev index next >