Skip to content

Commit 2fc7bbc

Browse files
Merge tag 'jdk-25+4' into labsjdk/adopt-jdk-25+4-master
Added tag jdk-25+4 for changeset a87bc7e
2 parents c136898 + a87bc7e commit 2fc7bbc

File tree

106 files changed

+6034
-783
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+6034
-783
lines changed

src/hotspot/cpu/s390/vm_version_s390.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,12 @@ void VM_Version::initialize() {
308308
if (FLAG_IS_DEFAULT(UseMontgomerySquareIntrinsic)) {
309309
FLAG_SET_DEFAULT(UseMontgomerySquareIntrinsic, true);
310310
}
311+
312+
// The OptoScheduling information is not maintained in s390.ad.
313+
if (OptoScheduling) {
314+
warning("OptoScheduling is not supported on this CPU.");
315+
FLAG_SET_DEFAULT(OptoScheduling, false);
316+
}
311317
#endif
312318
if (FLAG_IS_DEFAULT(UsePopCountInstruction)) {
313319
FLAG_SET_DEFAULT(UsePopCountInstruction, true);
@@ -323,12 +329,6 @@ void VM_Version::initialize() {
323329
if (FLAG_IS_DEFAULT(UseUnalignedAccesses)) {
324330
FLAG_SET_DEFAULT(UseUnalignedAccesses, true);
325331
}
326-
327-
// The OptoScheduling information is not maintained in s390.ad.
328-
if (OptoScheduling) {
329-
warning("OptoScheduling is not supported on this CPU.");
330-
FLAG_SET_DEFAULT(OptoScheduling, false);
331-
}
332332
}
333333

334334

src/hotspot/os/linux/os_linux.cpp

+26-8
Original file line numberDiff line numberDiff line change
@@ -3247,6 +3247,8 @@ bool os::Linux::libnuma_init() {
32473247
libnuma_dlsym(handle, "numa_set_bind_policy")));
32483248
set_numa_bitmask_isbitset(CAST_TO_FN_PTR(numa_bitmask_isbitset_func_t,
32493249
libnuma_dlsym(handle, "numa_bitmask_isbitset")));
3250+
set_numa_bitmask_equal(CAST_TO_FN_PTR(numa_bitmask_equal_func_t,
3251+
libnuma_dlsym(handle, "numa_bitmask_equal")));
32503252
set_numa_distance(CAST_TO_FN_PTR(numa_distance_func_t,
32513253
libnuma_dlsym(handle, "numa_distance")));
32523254
set_numa_get_membind(CAST_TO_FN_PTR(numa_get_membind_func_t,
@@ -3257,13 +3259,16 @@ bool os::Linux::libnuma_init() {
32573259
libnuma_dlsym(handle, "numa_move_pages")));
32583260
set_numa_set_preferred(CAST_TO_FN_PTR(numa_set_preferred_func_t,
32593261
libnuma_dlsym(handle, "numa_set_preferred")));
3262+
set_numa_get_run_node_mask(CAST_TO_FN_PTR(numa_get_run_node_mask_func_t,
3263+
libnuma_v2_dlsym(handle, "numa_get_run_node_mask")));
32603264

32613265
if (numa_available() != -1) {
32623266
set_numa_all_nodes((unsigned long*)libnuma_dlsym(handle, "numa_all_nodes"));
32633267
set_numa_all_nodes_ptr((struct bitmask **)libnuma_dlsym(handle, "numa_all_nodes_ptr"));
32643268
set_numa_nodes_ptr((struct bitmask **)libnuma_dlsym(handle, "numa_nodes_ptr"));
32653269
set_numa_interleave_bitmask(_numa_get_interleave_mask());
32663270
set_numa_membind_bitmask(_numa_get_membind());
3271+
set_numa_cpunodebind_bitmask(_numa_get_run_node_mask());
32673272
// Create an index -> node mapping, since nodes are not always consecutive
32683273
_nindex_to_node = new (mtInternal) GrowableArray<int>(0, mtInternal);
32693274
rebuild_nindex_to_node_map();
@@ -3440,9 +3445,11 @@ os::Linux::numa_interleave_memory_func_t os::Linux::_numa_interleave_memory;
34403445
os::Linux::numa_interleave_memory_v2_func_t os::Linux::_numa_interleave_memory_v2;
34413446
os::Linux::numa_set_bind_policy_func_t os::Linux::_numa_set_bind_policy;
34423447
os::Linux::numa_bitmask_isbitset_func_t os::Linux::_numa_bitmask_isbitset;
3448+
os::Linux::numa_bitmask_equal_func_t os::Linux::_numa_bitmask_equal;
34433449
os::Linux::numa_distance_func_t os::Linux::_numa_distance;
34443450
os::Linux::numa_get_membind_func_t os::Linux::_numa_get_membind;
34453451
os::Linux::numa_get_interleave_mask_func_t os::Linux::_numa_get_interleave_mask;
3452+
os::Linux::numa_get_run_node_mask_func_t os::Linux::_numa_get_run_node_mask;
34463453
os::Linux::numa_move_pages_func_t os::Linux::_numa_move_pages;
34473454
os::Linux::numa_set_preferred_func_t os::Linux::_numa_set_preferred;
34483455
os::Linux::NumaAllocationPolicy os::Linux::_current_numa_policy;
@@ -3451,6 +3458,7 @@ struct bitmask* os::Linux::_numa_all_nodes_ptr;
34513458
struct bitmask* os::Linux::_numa_nodes_ptr;
34523459
struct bitmask* os::Linux::_numa_interleave_bitmask;
34533460
struct bitmask* os::Linux::_numa_membind_bitmask;
3461+
struct bitmask* os::Linux::_numa_cpunodebind_bitmask;
34543462

34553463
bool os::pd_uncommit_memory(char* addr, size_t size, bool exec) {
34563464
uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE,
@@ -4475,19 +4483,19 @@ void os::Linux::numa_init() {
44754483
// bitmask when externally configured to run on all or fewer nodes.
44764484

44774485
if (!Linux::libnuma_init()) {
4478-
FLAG_SET_ERGO(UseNUMA, false);
4479-
FLAG_SET_ERGO(UseNUMAInterleaving, false); // Also depends on libnuma.
4486+
disable_numa("Failed to initialize libnuma");
44804487
} else {
4481-
if ((Linux::numa_max_node() < 1) || Linux::is_bound_to_single_node()) {
4482-
// If there's only one node (they start from 0) or if the process
4483-
// is bound explicitly to a single node using membind, disable NUMA
4484-
UseNUMA = false;
4488+
Linux::set_configured_numa_policy(Linux::identify_numa_policy());
4489+
if (Linux::numa_max_node() < 1) {
4490+
disable_numa("Only a single NUMA node is available");
4491+
} else if (Linux::is_bound_to_single_mem_node()) {
4492+
disable_numa("The process is bound to a single NUMA node");
4493+
} else if (Linux::mem_and_cpu_node_mismatch()) {
4494+
disable_numa("The process memory and cpu node configuration does not match");
44854495
} else {
44864496
LogTarget(Info,os) log;
44874497
LogStream ls(log);
44884498

4489-
Linux::set_configured_numa_policy(Linux::identify_numa_policy());
4490-
44914499
struct bitmask* bmp = Linux::_numa_membind_bitmask;
44924500
const char* numa_mode = "membind";
44934501

@@ -4525,6 +4533,16 @@ void os::Linux::numa_init() {
45254533
}
45264534
}
45274535

4536+
void os::Linux::disable_numa(const char* reason) {
4537+
if ((UseNUMA && FLAG_IS_CMDLINE(UseNUMA)) ||
4538+
(UseNUMAInterleaving && FLAG_IS_CMDLINE(UseNUMAInterleaving))) {
4539+
// Only issue a warning if the user explicitly asked for NUMA support
4540+
log_warning(os)("NUMA support disabled: %s", reason);
4541+
}
4542+
FLAG_SET_ERGO(UseNUMA, false);
4543+
FLAG_SET_ERGO(UseNUMAInterleaving, false);
4544+
}
4545+
45284546
#if defined(IA32) && !defined(ZERO)
45294547
/*
45304548
* Work-around (execute code at a high address) for broken NX emulation using CS limit,

src/hotspot/os/linux/os_linux.hpp

+32-5
Original file line numberDiff line numberDiff line change
@@ -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;

src/hotspot/share/gc/g1/g1HeapSizingPolicy.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,14 @@ size_t G1HeapSizingPolicy::young_collection_expansion_amount() {
198198
}
199199

200200
static size_t target_heap_capacity(size_t used_bytes, uintx free_ratio) {
201+
assert(free_ratio <= 100, "precondition");
202+
if (free_ratio == 100) {
203+
// If 100 then below calculations will divide by zero and return min of
204+
// resulting infinity and MaxHeapSize. Avoid issues of UB vs is_iec559
205+
// and ubsan warnings, and just immediately return MaxHeapSize.
206+
return MaxHeapSize;
207+
}
208+
201209
const double desired_free_percentage = (double) free_ratio / 100.0;
202210
const double desired_used_percentage = 1.0 - desired_free_percentage;
203211

0 commit comments

Comments
 (0)