@@ -193,6 +193,7 @@ class os::Linux {
193193 private:
194194 static void numa_init ();
195195
196+ static void disable_numa (const char * reason);
196197 typedef int (*sched_getcpu_func_t )(void );
197198 typedef int (*numa_node_to_cpus_func_t )(int node, unsigned long *buffer, int bufferlen);
198199 typedef int (*numa_node_to_cpus_v2_func_t )(int node, void *mask);
@@ -204,10 +205,12 @@ class os::Linux {
204205 typedef void (*numa_interleave_memory_v2_func_t )(void *start, size_t size, struct bitmask * mask);
205206 typedef struct bitmask * (*numa_get_membind_func_t )(void );
206207 typedef struct bitmask * (*numa_get_interleave_mask_func_t )(void );
208+ typedef struct bitmask * (*numa_get_run_node_mask_func_t )(void );
207209 typedef long (*numa_move_pages_func_t )(int pid, unsigned long count, void **pages, const int *nodes, int *status, int flags);
208210 typedef void (*numa_set_preferred_func_t )(int node);
209211 typedef void (*numa_set_bind_policy_func_t )(int policy);
210212 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);
211214 typedef int (*numa_distance_func_t )(int node1, int node2);
212215
213216 static sched_getcpu_func_t _sched_getcpu;
@@ -221,8 +224,10 @@ class os::Linux {
221224 static numa_interleave_memory_v2_func_t _numa_interleave_memory_v2;
222225 static numa_set_bind_policy_func_t _numa_set_bind_policy;
223226 static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset;
227+ static numa_bitmask_equal_func_t _numa_bitmask_equal;
224228 static numa_distance_func_t _numa_distance;
225229 static numa_get_membind_func_t _numa_get_membind;
230+ static numa_get_run_node_mask_func_t _numa_get_run_node_mask;
226231 static numa_get_interleave_mask_func_t _numa_get_interleave_mask;
227232 static numa_move_pages_func_t _numa_move_pages;
228233 static numa_set_preferred_func_t _numa_set_preferred;
@@ -231,6 +236,7 @@ class os::Linux {
231236 static struct bitmask * _numa_nodes_ptr;
232237 static struct bitmask * _numa_interleave_bitmask;
233238 static struct bitmask * _numa_membind_bitmask;
239+ static struct bitmask * _numa_cpunodebind_bitmask;
234240
235241 static void set_sched_getcpu (sched_getcpu_func_t func) { _sched_getcpu = func; }
236242 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 {
243249 static void set_numa_interleave_memory_v2 (numa_interleave_memory_v2_func_t func) { _numa_interleave_memory_v2 = func; }
244250 static void set_numa_set_bind_policy (numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; }
245251 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; }
246253 static void set_numa_distance (numa_distance_func_t func) { _numa_distance = func; }
247254 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; }
248256 static void set_numa_get_interleave_mask (numa_get_interleave_mask_func_t func) { _numa_get_interleave_mask = func; }
249257 static void set_numa_move_pages (numa_move_pages_func_t func) { _numa_move_pages = func; }
250258 static void set_numa_set_preferred (numa_set_preferred_func_t func) { _numa_set_preferred = func; }
@@ -253,6 +261,7 @@ class os::Linux {
253261 static void set_numa_nodes_ptr (struct bitmask **ptr) { _numa_nodes_ptr = (ptr == nullptr ? nullptr : *ptr); }
254262 static void set_numa_interleave_bitmask (struct bitmask * ptr) { _numa_interleave_bitmask = ptr ; }
255263 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 ; }
256265 static int sched_getcpu_syscall (void );
257266
258267 enum NumaAllocationPolicy{
@@ -358,21 +367,26 @@ class os::Linux {
358367 }
359368 return false ;
360369 }
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 () {
364373 int nodes = 0 ;
365374 unsigned int node = 0 ;
366375 unsigned int highest_node_number = 0 ;
367376
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 ) {
369383 highest_node_number = _numa_max_node ();
370384 } else {
371385 return false ;
372386 }
373387
374388 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)) {
376390 nodes++;
377391 }
378392 }
@@ -383,6 +397,19 @@ class os::Linux {
383397 return false ;
384398 }
385399 }
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+ }
386413
387414 static const GrowableArray<int >* numa_nindex_to_node () {
388415 return _nindex_to_node;
0 commit comments