@@ -193,6 +193,7 @@ class os::Linux {
193
193
private:
194
194
static void numa_init ();
195
195
196
+ static void disable_numa (const char * reason);
196
197
typedef int (*sched_getcpu_func_t )(void );
197
198
typedef int (*numa_node_to_cpus_func_t )(int node, unsigned long *buffer, int bufferlen);
198
199
typedef int (*numa_node_to_cpus_v2_func_t )(int node, void *mask);
@@ -204,10 +205,12 @@ class os::Linux {
204
205
typedef void (*numa_interleave_memory_v2_func_t )(void *start, size_t size, struct bitmask * mask);
205
206
typedef struct bitmask * (*numa_get_membind_func_t )(void );
206
207
typedef struct bitmask * (*numa_get_interleave_mask_func_t )(void );
208
+ typedef struct bitmask * (*numa_get_run_node_mask_func_t )(void );
207
209
typedef long (*numa_move_pages_func_t )(int pid, unsigned long count, void **pages, const int *nodes, int *status, int flags);
208
210
typedef void (*numa_set_preferred_func_t )(int node);
209
211
typedef void (*numa_set_bind_policy_func_t )(int policy);
210
212
typedef int (*numa_bitmask_isbitset_func_t )(struct bitmask *bmp, unsigned int n);
213
+ typedef int (*numa_bitmask_equal_func_t )(struct bitmask *bmp1, struct bitmask *bmp2);
211
214
typedef int (*numa_distance_func_t )(int node1, int node2);
212
215
213
216
static sched_getcpu_func_t _sched_getcpu;
@@ -221,8 +224,10 @@ class os::Linux {
221
224
static numa_interleave_memory_v2_func_t _numa_interleave_memory_v2;
222
225
static numa_set_bind_policy_func_t _numa_set_bind_policy;
223
226
static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset;
227
+ static numa_bitmask_equal_func_t _numa_bitmask_equal;
224
228
static numa_distance_func_t _numa_distance;
225
229
static numa_get_membind_func_t _numa_get_membind;
230
+ static numa_get_run_node_mask_func_t _numa_get_run_node_mask;
226
231
static numa_get_interleave_mask_func_t _numa_get_interleave_mask;
227
232
static numa_move_pages_func_t _numa_move_pages;
228
233
static numa_set_preferred_func_t _numa_set_preferred;
@@ -231,6 +236,7 @@ class os::Linux {
231
236
static struct bitmask * _numa_nodes_ptr;
232
237
static struct bitmask * _numa_interleave_bitmask;
233
238
static struct bitmask * _numa_membind_bitmask;
239
+ static struct bitmask * _numa_cpunodebind_bitmask;
234
240
235
241
static void set_sched_getcpu (sched_getcpu_func_t func) { _sched_getcpu = func; }
236
242
static void set_numa_node_to_cpus (numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; }
@@ -243,8 +249,10 @@ class os::Linux {
243
249
static void set_numa_interleave_memory_v2 (numa_interleave_memory_v2_func_t func) { _numa_interleave_memory_v2 = func; }
244
250
static void set_numa_set_bind_policy (numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; }
245
251
static void set_numa_bitmask_isbitset (numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; }
252
+ static void set_numa_bitmask_equal (numa_bitmask_equal_func_t func) { _numa_bitmask_equal = func; }
246
253
static void set_numa_distance (numa_distance_func_t func) { _numa_distance = func; }
247
254
static void set_numa_get_membind (numa_get_membind_func_t func) { _numa_get_membind = func; }
255
+ static void set_numa_get_run_node_mask (numa_get_run_node_mask_func_t func) { _numa_get_run_node_mask = func; }
248
256
static void set_numa_get_interleave_mask (numa_get_interleave_mask_func_t func) { _numa_get_interleave_mask = func; }
249
257
static void set_numa_move_pages (numa_move_pages_func_t func) { _numa_move_pages = func; }
250
258
static void set_numa_set_preferred (numa_set_preferred_func_t func) { _numa_set_preferred = func; }
@@ -253,6 +261,7 @@ class os::Linux {
253
261
static void set_numa_nodes_ptr (struct bitmask **ptr) { _numa_nodes_ptr = (ptr == nullptr ? nullptr : *ptr); }
254
262
static void set_numa_interleave_bitmask (struct bitmask * ptr) { _numa_interleave_bitmask = ptr ; }
255
263
static void set_numa_membind_bitmask (struct bitmask * ptr) { _numa_membind_bitmask = ptr ; }
264
+ static void set_numa_cpunodebind_bitmask (struct bitmask * ptr) { _numa_cpunodebind_bitmask = ptr ; }
256
265
static int sched_getcpu_syscall (void );
257
266
258
267
enum NumaAllocationPolicy{
@@ -358,21 +367,26 @@ class os::Linux {
358
367
}
359
368
return false ;
360
369
}
361
- // Check if bound to only one numa node.
362
- // Returns true if bound to a single numa node, otherwise returns false.
363
- static bool is_bound_to_single_node () {
370
+ // Check if memory is bound to only one numa node.
371
+ // Returns true if memory is bound to a single numa node, otherwise returns false.
372
+ static bool is_bound_to_single_mem_node () {
364
373
int nodes = 0 ;
365
374
unsigned int node = 0 ;
366
375
unsigned int highest_node_number = 0 ;
367
376
368
- if (_numa_membind_bitmask != nullptr && _numa_max_node != nullptr && _numa_bitmask_isbitset != nullptr ) {
377
+ struct bitmask * mem_nodes_bitmask = Linux::_numa_membind_bitmask;
378
+ if (Linux::is_running_in_interleave_mode ()) {
379
+ mem_nodes_bitmask = Linux::_numa_interleave_bitmask;
380
+ }
381
+
382
+ if (mem_nodes_bitmask != nullptr && _numa_max_node != nullptr && _numa_bitmask_isbitset != nullptr ) {
369
383
highest_node_number = _numa_max_node ();
370
384
} else {
371
385
return false ;
372
386
}
373
387
374
388
for (node = 0 ; node <= highest_node_number; node++) {
375
- if (_numa_bitmask_isbitset (_numa_membind_bitmask , node)) {
389
+ if (_numa_bitmask_isbitset (mem_nodes_bitmask , node)) {
376
390
nodes++;
377
391
}
378
392
}
@@ -383,6 +397,19 @@ class os::Linux {
383
397
return false ;
384
398
}
385
399
}
400
+ // Check if cpu and memory nodes are aligned, returns true if nodes misalign
401
+ static bool mem_and_cpu_node_mismatch () {
402
+ struct bitmask * mem_nodes_bitmask = Linux::_numa_membind_bitmask;
403
+ if (Linux::is_running_in_interleave_mode ()) {
404
+ mem_nodes_bitmask = Linux::_numa_interleave_bitmask;
405
+ }
406
+
407
+ if (mem_nodes_bitmask == nullptr || Linux::_numa_cpunodebind_bitmask == nullptr ) {
408
+ return false ;
409
+ }
410
+
411
+ return !_numa_bitmask_equal (mem_nodes_bitmask, Linux::_numa_cpunodebind_bitmask);
412
+ }
386
413
387
414
static const GrowableArray<int >* numa_nindex_to_node () {
388
415
return _nindex_to_node;
0 commit comments