RFR(L) 8140520 segfault on solaris-amd64 with "-XX:VMThreadStackSize=1" option

Daniel D. Daugherty daniel.daugherty at oracle.com
Fri Sep 2 18:28:30 UTC 2016


Greetings,

I am shepherding the fix for the following bug for Ron Durbin:

     JDK-8140520 segfault on solaris-amd64 with 
"-XX:VMThreadStackSize=1" option
     https://bugs.openjdk.java.net/browse/JDK-8140520

Almost all of the product code is Ron's, all of the test code is mine and
all of the product code refactoring is Coleen's. I will be handling the
responses to all code review comments and suggestions. Thanks to Jerry for
reviewing earlier versions of Ron's work on this bug. Thanks to David H.
and Coleen for reviewing versions after I started shepherding.

The primary focus of this change is to decouple the various thread stack
sizes from each other. In particular, decouple CompilerThreadStackSize
from VMThreadStackSize to avoid use of VMThreadStackSize defaults for
CompilerThreadStackSize.

There are almost no Win* changes here because the Win* thread stack size
implementation differs significantly from the *NIX implementation. I have
a first pass implementation for the Win* changes, but Win* stack pages
don't behave like I expect so I will split Win* off into another bug.

The AIX and PPC parts of the fix are "best guesses" because we don't have
a way to build and test AIX and/or PPC in Oracle. I'll need help from the
usual AIX and PPC folks for checking out those changes.

Overview of the changes:

- The CompilerThreadStackSize default has been changed from zero to
   match the default VMThreadStackSize on each platform; see the various
   globals_*.hpp files.

- There are now three minimum stack sizes: java_thread_min_stack_allowed
   compiler_thread_min_stack_allowed, and 
vm_internal_thread_min_stack_allowed.
   In all cases except for Solaris X64, the two new minimums are initialized
   to same value as the original min_stack_allowed; see the various
   */os_cpu/*/os_*.cpp files.

   Key change: On Solaris X64 the new compiler_thread_min_stack_allowed
   value is 394K instead of the old min_stack_allowed value of 224K.

- os::create_thread()'s stack size parameter has been clarified to be
   the "requested stack size". The stack size adjustment logic has been
   updated to support the three minimum stack sizes.

   Key change: the VMThreadStackSize default is no longer used as the
   CompilerThreadStackSize default.

- os::init_2()'s minimum stack size setting and checking logic has
   been updated to support the three minimum stack sizes.

   Key change: CompilerThreadStackSize and VMThreadStackSize are no longer
   silently rounded up when their specified value is too small. This matches
   the behavior for both '-Xss<n_bytes>' and 
'-XX:ThreadStackSize=<k_bytes>'.

   Note: The recent fix for the following bug:

     8159335: Fix problems with stack overflow handling.

   updated the existing minimum stack size calculations to ensure that they
   are aligned with os::vm_page_size(). I've updated Ron's solution for
   this bug to include the new alignment work with the two new minimum
   stack sizes.

Bugs fixed:

- The Solaris X64 crash when "-XX:VMThreadStackSize=1" is specified
   without specifying "-XX:CompilerThreadStackSize=<k_bytes>" is fixed.
- Newly defined ThreadType values are explicitly handled as VM internal
   threads instead of skating through the case statements.
- On platforms that use default_stack_size(), the bug where a default
   value returned for a compiler_thread was ignored is fixed.

Changes in behavior:

- Use of -XX:VMThreadStackSize=<k_foo> will no longer affect the value
   of CompilerThreadStackSize when -XX:CompilerThreadStackSize=<bar>
   is not specified.
- When neither -XX:VMThreadStackSize=<foo> or 
-XX:CompilerThreadStackSize=<bar>
   are specified on the command line, then CompilerThreadStackSize will use
   a distinct default value than VMThreadStackSize.
- Use of a too small -XX:CompilerThreadStackSize=<bar> value or
   a -XX:VMThreadStackSize=<foo> will generate an error message
   instead of silently rounding up.

Refactoring changes:

- os::Posix::get_initial_stack_size() and 
os::Posix::set_minimum_stack_sizes()
   created as a place to land common *NIX code; once we figure out how 
to add
   support for the three thread stack sizes to Win*, this code will move 
again.
- default_stack_size() added to all platforms.
- default_guard_size() removed from platforms that were not using it; only
   Linux uses it.


Webrev URL: 
http://cr.openjdk.java.net/~dcubed/8140520-webrev/3-jdk9-hs-open/


Testing:

- There is a temporary change in hotspot/test/TEST.groups that allows
   runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java to
   run during JPRT jobs. That test is normally excluded from the
   hotspot_fast_runtime group in JPRT jobs.
- I've copied and modified the TooSmallStackSize.java test from the
   launcher's tests in the jdk repo. The jdk repo version exercises the
   '-Xss<n_bytes>' option. The hotspot repo version exercises the
   '-XX:ThreadStackSize=<k_bytes>', '-XX:CompilerThreadStackSize=<k_bytes>',
   and '-XX:VMThreadStackSize=<k_bytes>' options.
- RBT JDK9-hs nightly results were generated and no regressions were
   observed; another round was started after the latest resync, but has
   not yet finished


Future Work:

- Add {compiler,vm_internal}_thread_min_stack_allowed support to Windows

   - Have the beginnings of an implementation, but stack sizes and the
     underlying pages aren't working as I expect.

- Switch TooSmallStackSize.java from local TestHelper.java to the newer
   test framework

   - TestHelper.java is a copy of the launcher's TestHelper.java since
     that was the easiest way to bring up the new test. The dependencies
     in TooSmallStackSize.java on TestHelper.java need to be identified
     and replaced with newer test library equivalents if possible.

- Determine whether the minimum stack values can be reduced on the
   different platforms.

   - With a single minimum stack size value, it's possible that the
     minimum has been bumped up over the years for one thread type,
     e.g., Compiler threads, when the other thread types didn't need
     the extra space.
   - Will need to do some spelunking through the change histories
     and then some old fashioned value range testing.

- There is a block of Solaris specific code in
   os::Posix::set_minimum_stack_sizes(); Coleen filed the following
   bug to remove that code:

   JDK-8161093 Solaris for >8k pagesize adds extra guard pages
   https://bugs.openjdk.java.net/browse/JDK-8161093

Thanks, in advance, for any comments, suggestions or questions!

Dan (, Ron and Coleen)


More information about the hotspot-runtime-dev mailing list