205 static void initialize_os_info();
206 static bool os_version_is_known();
207 static uint32_t os_version();
208
209 // Stack repair handling
210
211 // none present
212
213 private:
214 static void expand_stack_to(address bottom);
215
216 typedef int (*sched_getcpu_func_t)(void);
217 typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen);
218 typedef int (*numa_max_node_func_t)(void);
219 typedef int (*numa_num_configured_nodes_func_t)(void);
220 typedef int (*numa_available_func_t)(void);
221 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node);
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 typedef struct bitmask* (*numa_get_membind_func_t)(void);
225
226 typedef void (*numa_set_bind_policy_func_t)(int policy);
227 typedef int (*numa_bitmask_isbitset_func_t)(struct bitmask *bmp, unsigned int n);
228 typedef int (*numa_distance_func_t)(int node1, int node2);
229
230 static sched_getcpu_func_t _sched_getcpu;
231 static numa_node_to_cpus_func_t _numa_node_to_cpus;
232 static numa_max_node_func_t _numa_max_node;
233 static numa_num_configured_nodes_func_t _numa_num_configured_nodes;
234 static numa_available_func_t _numa_available;
235 static numa_tonode_memory_func_t _numa_tonode_memory;
236 static numa_interleave_memory_func_t _numa_interleave_memory;
237 static numa_interleave_memory_v2_func_t _numa_interleave_memory_v2;
238 static numa_set_bind_policy_func_t _numa_set_bind_policy;
239 static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset;
240 static numa_distance_func_t _numa_distance;
241 static numa_get_membind_func_t _numa_get_membind;
242 static unsigned long* _numa_all_nodes;
243 static struct bitmask* _numa_all_nodes_ptr;
244 static struct bitmask* _numa_nodes_ptr;
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_num_configured_nodes(numa_num_configured_nodes_func_t func) { _numa_num_configured_nodes = func; }
250 static void set_numa_available(numa_available_func_t func) { _numa_available = func; }
251 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; }
252 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; }
253 static void set_numa_interleave_memory_v2(numa_interleave_memory_v2_func_t func) { _numa_interleave_memory_v2 = func; }
254 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; }
255 static void set_numa_bitmask_isbitset(numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; }
256 static void set_numa_distance(numa_distance_func_t func) { _numa_distance = func; }
257 static void set_numa_get_membind(numa_get_membind_func_t func) { _numa_get_membind = func; }
258 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; }
259 static void set_numa_all_nodes_ptr(struct bitmask **ptr) { _numa_all_nodes_ptr = (ptr == NULL ? NULL : *ptr); }
260 static void set_numa_nodes_ptr(struct bitmask **ptr) { _numa_nodes_ptr = (ptr == NULL ? NULL : *ptr); }
261 static int sched_getcpu_syscall(void);
262 public:
263 static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; }
264 static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) {
265 return _numa_node_to_cpus != NULL ? _numa_node_to_cpus(node, buffer, bufferlen) : -1;
266 }
267 static int numa_max_node() { return _numa_max_node != NULL ? _numa_max_node() : -1; }
268 static int numa_num_configured_nodes() {
269 return _numa_num_configured_nodes != NULL ? _numa_num_configured_nodes() : -1;
270 }
271 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; }
272 static int numa_tonode_memory(void *start, size_t size, int node) {
273 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1;
274 }
275 static void numa_interleave_memory(void *start, size_t size) {
276 // Use v2 api if available
277 if (_numa_interleave_memory_v2 != NULL && _numa_all_nodes_ptr != NULL) {
278 _numa_interleave_memory_v2(start, size, _numa_all_nodes_ptr);
279 } else if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) {
280 _numa_interleave_memory(start, size, _numa_all_nodes);
281 }
282 }
283 static void numa_set_bind_policy(int policy) {
284 if (_numa_set_bind_policy != NULL) {
285 _numa_set_bind_policy(policy);
286 }
287 }
288 static int numa_distance(int node1, int node2) {
289 return _numa_distance != NULL ? _numa_distance(node1, node2) : -1;
290 }
291 static int get_node_by_cpu(int cpu_id);
292 static int get_existing_num_nodes();
293 // Check if numa node is configured (non-zero memory node).
294 static bool isnode_in_configured_nodes(unsigned int n) {
295 if (_numa_bitmask_isbitset != NULL && _numa_all_nodes_ptr != NULL) {
296 return _numa_bitmask_isbitset(_numa_all_nodes_ptr, n);
297 } else
298 return false;
|
205 static void initialize_os_info();
206 static bool os_version_is_known();
207 static uint32_t os_version();
208
209 // Stack repair handling
210
211 // none present
212
213 private:
214 static void expand_stack_to(address bottom);
215
216 typedef int (*sched_getcpu_func_t)(void);
217 typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen);
218 typedef int (*numa_max_node_func_t)(void);
219 typedef int (*numa_num_configured_nodes_func_t)(void);
220 typedef int (*numa_available_func_t)(void);
221 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node);
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 typedef struct bitmask* (*numa_get_membind_func_t)(void);
225 typedef struct bitmask* (*numa_get_interleave_mask_func_t)(void);
226
227 typedef void (*numa_set_bind_policy_func_t)(int policy);
228 typedef int (*numa_bitmask_isbitset_func_t)(struct bitmask *bmp, unsigned int n);
229 typedef int (*numa_distance_func_t)(int node1, int node2);
230
231 static sched_getcpu_func_t _sched_getcpu;
232 static numa_node_to_cpus_func_t _numa_node_to_cpus;
233 static numa_max_node_func_t _numa_max_node;
234 static numa_num_configured_nodes_func_t _numa_num_configured_nodes;
235 static numa_available_func_t _numa_available;
236 static numa_tonode_memory_func_t _numa_tonode_memory;
237 static numa_interleave_memory_func_t _numa_interleave_memory;
238 static numa_interleave_memory_v2_func_t _numa_interleave_memory_v2;
239 static numa_set_bind_policy_func_t _numa_set_bind_policy;
240 static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset;
241 static numa_distance_func_t _numa_distance;
242 static numa_get_membind_func_t _numa_get_membind;
243 static numa_get_interleave_mask_func_t _numa_get_interleave_mask;
244
245 static unsigned long* _numa_all_nodes;
246 static struct bitmask* _numa_all_nodes_ptr;
247 static struct bitmask* _numa_nodes_ptr;
248 static struct bitmask* _numa_interleave_ptr;
249 static struct bitmask* _numa_membind_ptr;
250
251 static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; }
252 static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; }
253 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; }
254 static void set_numa_num_configured_nodes(numa_num_configured_nodes_func_t func) { _numa_num_configured_nodes = func; }
255 static void set_numa_available(numa_available_func_t func) { _numa_available = func; }
256 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; }
257 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; }
258 static void set_numa_interleave_memory_v2(numa_interleave_memory_v2_func_t func) { _numa_interleave_memory_v2 = func; }
259 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; }
260 static void set_numa_bitmask_isbitset(numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; }
261 static void set_numa_distance(numa_distance_func_t func) { _numa_distance = func; }
262 static void set_numa_get_membind(numa_get_membind_func_t func) { _numa_get_membind = func; }
263 static void set_numa_get_interleave_mask(numa_get_interleave_mask_func_t func) { _numa_get_interleave_mask = func; }
264 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; }
265 static void set_numa_all_nodes_ptr(struct bitmask* ptr) { _numa_all_nodes_ptr = ptr; }
266 static void set_numa_nodes_ptr(struct bitmask* ptr) { _numa_nodes_ptr = ptr; }
267 static void set_numa_interleave_ptr(struct bitmask* ptr) { _numa_interleave_ptr = ptr; }
268 static void set_numa_membind_ptr(struct bitmask* ptr) { _numa_membind_ptr = ptr; }
269 static int sched_getcpu_syscall(void);
270 public:
271 static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; }
272 static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) {
273 return _numa_node_to_cpus != NULL ? _numa_node_to_cpus(node, buffer, bufferlen) : -1;
274 }
275 static int numa_max_node() { return _numa_max_node != NULL ? _numa_max_node() : -1; }
276 static int numa_num_configured_nodes() {
277 return _numa_num_configured_nodes != NULL ? _numa_num_configured_nodes() : -1;
278 }
279 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; }
280 static int numa_tonode_memory(void *start, size_t size, int node) {
281 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1;
282 }
283 static void numa_interleave_memory(void *start, size_t size) {
284 // Use v2 api if available
285 if (_numa_interleave_memory_v2 != NULL && _numa_all_nodes_ptr != NULL) {
286 if (_numa_interleave_ptr != NULL) {
287 // If externally invoked in interleave mode then use interleave bitmask.
288 _numa_interleave_memory_v2(start, size, _numa_interleave_ptr);
289 } else {
290 _numa_interleave_memory_v2(start, size, _numa_membind_ptr);
291 }
292 } else if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) {
293 _numa_interleave_memory(start, size, _numa_all_nodes);
294 }
295 }
296 static void numa_set_bind_policy(int policy) {
297 if (_numa_set_bind_policy != NULL) {
298 _numa_set_bind_policy(policy);
299 }
300 }
301 static int numa_distance(int node1, int node2) {
302 return _numa_distance != NULL ? _numa_distance(node1, node2) : -1;
303 }
304 static int get_node_by_cpu(int cpu_id);
305 static int get_existing_num_nodes();
306 // Check if numa node is configured (non-zero memory node).
307 static bool isnode_in_configured_nodes(unsigned int n) {
308 if (_numa_bitmask_isbitset != NULL && _numa_all_nodes_ptr != NULL) {
309 return _numa_bitmask_isbitset(_numa_all_nodes_ptr, n);
310 } else
311 return false;
|