Skip to content

Commit dfe3555

Browse files
committed
8303215: Make thread stacks not use huge pages
Backport-of: 59d9d9fcb93c26dd8931d70934b889245b050acc
1 parent 52fb263 commit dfe3555

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

src/hotspot/os/linux/os_linux.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,15 @@ bool os::create_thread(Thread* thread, ThreadType thr_type,
851851
}
852852
assert(is_aligned(stack_size, os::vm_page_size()), "stack_size not aligned");
853853

854+
// Add an additional page to the stack size to reduce its chances of getting large page aligned
855+
// so that the stack does not get backed by a transparent huge page.
856+
size_t default_large_page_size = os::Linux::default_large_page_size();
857+
if (default_large_page_size != 0 &&
858+
stack_size >= default_large_page_size &&
859+
is_aligned(stack_size, default_large_page_size)) {
860+
stack_size += os::vm_page_size();
861+
}
862+
854863
int status = pthread_attr_setstacksize(&attr, stack_size);
855864
if (status != 0) {
856865
// pthread_attr_setstacksize() function can fail
@@ -3801,8 +3810,11 @@ bool os::Linux::setup_large_page_type(size_t page_size) {
38013810
}
38023811

38033812
void os::large_page_init() {
3804-
// 1) Handle the case where we do not want to use huge pages and hence
3805-
// there is no need to scan the OS for related info
3813+
// Always initialize the default large page size even if large pages are not being used.
3814+
size_t default_large_page_size = scan_default_large_page_size();
3815+
os::Linux::_default_large_page_size = default_large_page_size;
3816+
3817+
// 1) Handle the case where we do not want to use huge pages
38063818
if (!UseLargePages &&
38073819
!UseTransparentHugePages &&
38083820
!UseHugeTLBFS &&
@@ -3820,9 +3832,7 @@ void os::large_page_init() {
38203832
return;
38213833
}
38223834

3823-
// 2) Scan OS info
3824-
size_t default_large_page_size = scan_default_large_page_size();
3825-
os::Linux::_default_large_page_size = default_large_page_size;
3835+
// 2) check if large pages are configured
38263836
if (default_large_page_size == 0) {
38273837
// No large pages configured, return.
38283838
warn_no_large_pages_configured();

src/hotspot/os_cpu/linux_aarch64/globals_linux_aarch64.hpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,18 @@
3030
// (see globals.hpp)
3131

3232
define_pd_global(bool, DontYieldALot, false);
33-
define_pd_global(intx, ThreadStackSize, 2048); // 0 => use system default
34-
define_pd_global(intx, VMThreadStackSize, 2048);
3533

36-
define_pd_global(intx, CompilerThreadStackSize, 2048);
34+
// Set default stack sizes < 2MB so as to prevent stacks from getting
35+
// large-page aligned and backed by THPs on systems where 2MB is the
36+
// default huge page size. For non-JavaThreads, glibc may add an additional
37+
// guard page to the total stack size, so to keep the default sizes same
38+
// for all the following flags, we set them to 2 pages less than 2MB. On
39+
// systems where 2MB is the default large page size, 4KB is most commonly
40+
// the regular page size.
41+
define_pd_global(intx, ThreadStackSize, 2040); // 0 => use system default
42+
define_pd_global(intx, VMThreadStackSize, 2040);
43+
44+
define_pd_global(intx, CompilerThreadStackSize, 2040);
3745

3846
define_pd_global(uintx,JVMInvokeMethodSlack, 8192);
3947

0 commit comments

Comments
 (0)