--- old/src/os/linux/vm/os_linux.cpp 2018-01-26 00:12:32.100196990 -0500 +++ new/src/os/linux/vm/os_linux.cpp 2018-01-26 00:12:32.046196993 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -946,8 +946,8 @@ } } - if (os::Linux::is_initial_thread()) { - // If current thread is initial thread, its stack is mapped on demand, + if (os::is_primordial_thread()) { + // If current thread is primordial thread, its stack is mapped on demand, // see notes about MAP_GROWSDOWN. Here we try to force kernel to map // the entire stack region to avoid SEGV in stack banging. // It is also useful to get around the heap-stack-gap problem on SuSE @@ -1032,21 +1032,24 @@ } ////////////////////////////////////////////////////////////////////////////// -// initial thread +// primordial thread -// Check if current thread is the initial thread, similar to Solaris thr_main. -bool os::Linux::is_initial_thread(void) { +// Check if current thread is the primordial thread, similar to Solaris thr_main. +bool os::is_primordial_thread(void) { char dummy; // If called before init complete, thread stack bottom will be null. // Can be called if fatal error occurs before initialization. - if (initial_thread_stack_bottom() == NULL) return false; - assert(initial_thread_stack_bottom() != NULL && - initial_thread_stack_size() != 0, - "os::init did not locate initial thread's stack region"); - if ((address)&dummy >= initial_thread_stack_bottom() && - (address)&dummy < initial_thread_stack_bottom() + initial_thread_stack_size()) + if (os::Linux::initial_thread_stack_bottom() == NULL) return false; + assert(os::Linux::initial_thread_stack_bottom() != NULL && + os::Linux::initial_thread_stack_size() != 0, + "os::init did not locate primordial thread's stack region"); + if ((address)&dummy >= os::Linux::initial_thread_stack_bottom() && + (address)&dummy < os::Linux::initial_thread_stack_bottom() + + os::Linux::initial_thread_stack_size()) { return true; - else return false; + } else { + return false; + } } // Find the virtual memory area that contains addr @@ -1073,7 +1076,7 @@ return false; } -// Locate initial thread stack. This special handling of initial thread stack +// Locate primordial thread stack. This special handling of primordial thread stack // is needed because pthread_getattr_np() on most (all?) Linux distros returns // bogus value for the primordial process thread. While the launcher has created // the VM in a new thread since JDK 6, we still have to allow for the use of the @@ -1097,7 +1100,10 @@ // 6308388: a bug in ld.so will relocate its own .data section to the // lower end of primordial stack; reduce ulimit -s value a little bit // so we won't install guard page on ld.so's data section. - stack_size -= 2 * page_size(); + // But ensure we don't underflow the stack size - allow 1 page spare + if (stack_size >= (size_t)(3 * page_size())) { + stack_size -= 2 * page_size(); + } // Try to figure out where the stack base (top) is. This is harder. // @@ -1218,16 +1224,16 @@ if (i != 28 - 2) { assert(false, "Bad conversion from /proc/self/stat"); - // product mode - assume we are the initial thread, good luck in the + // product mode - assume we are the primordial thread, good luck in the // embedded case. - warning("Can't detect initial thread stack location - bad conversion"); + warning("Can't detect primordial thread stack location - bad conversion"); stack_start = (uintptr_t) &rlim; } } else { // For some reason we can't open /proc/self/stat (for example, running on // FreeBSD with a Linux emulator, or inside chroot), this should work for // most cases, so don't abort: - warning("Can't detect initial thread stack location - no /proc/self/stat"); + warning("Can't detect primordial thread stack location - no /proc/self/stat"); stack_start = (uintptr_t) &rlim; } } @@ -1247,7 +1253,7 @@ stack_top = (uintptr_t)high; } else { // failed, likely because /proc/self/maps does not exist - warning("Can't detect initial thread stack location - find_vma failed"); + warning("Can't detect primordial thread stack location - find_vma failed"); // best effort: stack_start is normally within a few pages below the real // stack top, use it as stack top, and reduce stack size so we won't put // guard page outside stack. @@ -3066,11 +3072,11 @@ // where we're going to put our guard pages, truncate the mapping at // that point by munmap()ping it. This ensures that when we later // munmap() the guard pages we don't leave a hole in the stack -// mapping. This only affects the main/initial thread +// mapping. This only affects the main/primordial thread bool os::pd_create_stack_guard_pages(char* addr, size_t size) { - if (os::Linux::is_initial_thread()) { + if (os::is_primordial_thread()) { // As we manually grow stack up to bottom inside create_attached_thread(), // it's likely that os::Linux::initial_thread_stack_bottom is mapped and // we don't need to do anything special. @@ -3095,14 +3101,14 @@ // If this is a growable mapping, remove the guard pages entirely by // munmap()ping them. If not, just call uncommit_memory(). This only -// affects the main/initial thread, but guard against future OS changes -// It's safe to always unmap guard pages for initial thread because we -// always place it right after end of the mapped region +// affects the main/primordial thread, but guard against future OS changes. +// It's safe to always unmap guard pages for primordial thread because we +// always place it right after end of the mapped region. bool os::remove_stack_guard_pages(char* addr, size_t size) { uintptr_t stack_extent, stack_base; - if (os::Linux::is_initial_thread()) { + if (os::is_primordial_thread()) { return ::munmap(addr, size) == 0; } @@ -4877,10 +4883,9 @@ } } -// this is called _before_ the most of global arguments have been parsed +// this is called _before_ most of the global arguments have been parsed void os::init(void) { char dummy; /* used to get a guess on initial stack address */ -// first_hrtime = gethrtime(); // With LinuxThreads the JavaMain thread pid (primordial thread) // is different than the pid of the java launcher thread. @@ -4907,7 +4912,7 @@ Linux::initialize_system_info(); - // main_thread points to the aboriginal thread + // _main_thread points to the thread that created/loaded the JVM. Linux::_main_thread = pthread_self(); Linux::clock_init();