<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@SimSun";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoPlainText">Hi, <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I would like to fix two issues of minimum stack size computation:<o:p></o:p></p>
<p class="MsoPlainText"><a href="http://cr.openjdk.java.net/~goetz/wr16/8170655-compilerGuardFix/webrev.01/">http://cr.openjdk.java.net/~goetz/wr16/8170655-compilerGuardFix/webrev.01/</a><o:p></o:p></p>
<p class="MsoPlainText">Please review and sponsor.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">This are the issues I excluded from the "8169373: Work around linux NPTL stack guard error."<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">I wrote a lengthy explanation in the bug, trying to comment on what was<o:p></o:p></p>
<p class="MsoPlainText">said in the other thread.  I'll repeat it here, I think that's better for discussion.<o:p></o:p></p>
<p class="MsoPlainText">Dan, thanks for improving the text, I use the improved variant here:<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">HotSpot has three cmd line options to set stack sizes (besides -Xss):
<o:p></o:p></p>
<p class="MsoPlainText"> -XX:ThreadStackSize for threads executing Java code. <o:p>
</o:p></p>
<p class="MsoPlainText"> -XX:CompilerThreadStackSize for threads used by the JIT compilers.
<o:p></o:p></p>
<p class="MsoPlainText"> -XX:VMThreadStackSize for threads executing VM internal tasks as gc.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">All these flags should not be set to a value that leads to a stack overflow before user code can be executed. As the VM executes a lot of code for initialization and also the JIT already compiles methods, considerable amounts of stack
 can be used during startup. We must try to avoid stack overflows before startup is complete as error handling might not be properly in place yet.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Required minimum stack sizes depend on frame sizes and program execution paths. Frame sizes again depend on the C compiler used, the platform compiled for, and design decisions in interpreter, C1 and C2.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Required stack sizes also depend on option settings, e.g. with JVM/TI enabled, frames can get bigger. With inlining increased JIT compilers might do more optimizations leading to deeper call chains, etc.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">While the minimum stack sizes should reflect differences in Platform and compiler, they must not, and cannot, cover all possible option settings.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">This change addresses two issues: <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">1. Fixed minimum stack size configuration <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Currently, the minimum Java thread size is given in a constant per os/cpu platform for each of the three stack kinds. This number includes the size required for guard pages.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">The guard pages are used for stack overflow detection. They make up 4 zones on the stack: Red, Yellow, Reserved and Shadow pages. The Red, Yellow and Reserved pages are protected to detect stack overflows. The Shadow pages are just some
 extra space to allow methods that don't do a stack bang to execute. <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Unfortunately, the size required for guard pages is not fixed at compile time. It depends on the concrete system the VM is started on. Thus the minimum sizes given can be too small to hold the guard pages. This lead to errors in the
 past that were solved by introducing code that overruled the per-platform minimum stack size. This code nowadays is the MAX2() in os_posix.cpp:1114 and the SOLARIS special case further down. It uses the value (4 * BytesPerWord COMPILER2_PRESENT(+ 2)) * 4 *
 K) (os_posix.cpp:1117) as minimum required space for frames. Thereby it effectively overrules the minimum stack size settings given in the os/cpu constants, and there is currently no way to specify this size per platform.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">This change proposes to fix this issue by specifying the space needed for stack frames in the os/cpu constants. During startup, this number is increased by the space required for the guard pages. Thus, this takes into account the page
 size of the concrete system the VM runs on, and also eventual changes to the guard pages by the flags StackRed/Yellow/Reserved/Shadow/Pages. This gives the opportunity to reduce the minimum stack sizes on systems with small pages.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Minimum stack size configuration is more simple with this change and valid for systems with any page size.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">2. Stack guard pages not considered for compiler thread stacks
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Compiler threads are Java threads. The C++ class CompilerThread is a subclass of JavaThread. When a compiler thread is started, JavaThread::run() is executed which protects the red, yellow and reserved pages.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Since 8140520 the minimum stack sizes for Compiler and VM internal threads no longer include the space for the guard pages. This is correct for the VM internal threads, but not for the Compiler thread.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">For the HotSpot C1 and C2 compilers it would be fine to reserve space for the Red/Yellow/Reserved pages, as they don't stack bang with the shadow page size. But since introducing JVMCI, compilers written in Java can be running on the
 compiler threads. Therefore the shadow pages are needed, too. <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">As for the Java thread, this change uses a os/cpu constant for the required minimum space for compiler frames and then adds the zone sizes to the minimum stack sizes during startup.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">New sizing: <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">The constants of the os/cpu minimum thread sizes are reduced by the default guard page sizes and then verified by starting the VM to assure the stack still suffices to get through startup. Hotspot jtreg tests are passing. The overall
 sizes required (after adding guard pages) on the systems I have available get a bit smaller. In most cases the sizes even suffice to run simple programs as SpecJvm98. The table below gives the systems I tested and the required sizes reported when started with
 too small stacks. <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><pre> <span style="font-family:"Courier New""><o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New""> Thread kind:       Java      Compiler  VM
<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New"">                    old new   old new   old new
<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New"">bsd x86_64    dbg: 240 232    64  64    64  64
<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New"">               opt: 240 232    64  64    64  64
<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New"">linux x86_64  dbg: 240 144    64 152    64  64
<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New"">               opt: 232 136    64 144    64  64
<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="font-family:"Courier New"">solaris sparc dbg:
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New"">               opt: 240 192   128 128   128 128
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New"">aix ppc64     dbg: 512 512   384 512   128 128
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New"">               opt: 512 512   384 512   128 128
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New""> linux ppc64   dbg: 512 384   128 384   128  64
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New"">               opt: 512 384   128 384   128  64
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New""> linux ppc64le dbg: 512 384   128 384   128  64
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New"">               opt: 512 384   128 384   128  64
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New"">linux s390    dbg: 236 140   128 184   128  32
<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="FR" style="font-family:"Courier New"">               </span><span style="font-family:"Courier New"">opt: 236 124   128 144   128  32
<o:p></o:p></span></p>
<p class="MsoPlainText"> </pre><o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
</div>
</body>
</html>