On 15/12/2015 7:25 PM, Thomas Stüfe wrote:
Hi Jeremy, David,

I would like to understand the problem better and have some questions,
maybe you could answer?

The "specification" for ELF based TLS as I understood it is the Ulrich Drepper document I referenced: ""ELF Handling for Thread Local Storage", for which I don't have a URL handy. But you can see basically the same kind of information in the Solaris document:

https://docs.oracle.com/cd/E26502_01/pdf/E26507.pdf

the details are complex as it depends on the exact model being used.

- What is the difference between "static __thread int x" and "__thread
int x" - one lives in the thread stacks, one does not?

If we are working with the initial executable or a statically linked library then the storage for a static TLS variable can be allocated in a static data segment. For a dynamic library there are two options: there may be some spare space in the static area which may be used, or the storage is allocated in the Thread-Control-Block - again it depends on the model. And I guess it is up to the implementation as to how/where it manages TCBs - they might be placed at the top of the stack, I don't know.

- What happens with existing threads if a library is loaded which uses
this form of TLS?

See above.

- Does this TLS live at the top of the stack? So, to find out if a third
party library uses this form of TLS, we could check the distance of sp
to the stack base in java_start()?

Depends on the implementation. I'm not concerned with trying to solve any general problem here, just the problem with this specific test (which I have not yet seen :) )

- Would the region returned by pthread_attr_getstack() include the TLS
region?

That's up to glibc.

David

Thanks!

Kind Regards, Thomas


On Tue, Dec 15, 2015 at 8:25 AM, David Holmes <david.hol...@oracle.com
<mailto:david.hol...@oracle.com>> wrote:

    On 15/12/2015 4:32 PM, Jeremy Manson wrote:

        David: What the spec says and what glibc does are two different
        things:

        https://sourceware.org/bugzilla/show_bug.cgi?id=11787

        We have an internal Google patch to compensate for this.  Nasty
        stuff.


    Nasty isn't even the right word - this is just ludicrous! And the
    bug has just languished even though they were going to fix it years
    ago!!!!! And I also cried when I saw the part finally recognizing
    that glibc does the wrong thing by taking the guard pages from the
    requested stack size!

    To me this just screams don't use TLS on linux except for trivially
    small data structures, or else use static-TLS.

    Which brings me back to this test - make the variable static!

    Thanks Jeremy. I'm thoroughly depressed now.

    David
    -----

        Jeremy

        On Mon, Dec 14, 2015 at 8:44 PM, David Holmes
        <david.hol...@oracle.com <mailto:david.hol...@oracle.com>
        <mailto:david.hol...@oracle.com
        <mailto:david.hol...@oracle.com>>> wrote:

             On 15/12/2015 6:53 AM, Martin Buchholz wrote:

                 Thread local storage is trouble.

                 java stack sizes should be in _addition_ to any OS
        overhead,
                 which includes TLS.


             TLS shouldn't be coming out the stack of the thread AFAIK -
        I see
             nothing about that in "ELF Handling for Thread Local
        Storage". That
             is why I want to know more about the test, the compilation
             environment and the execution environment.

                 IOW, the java thread stack size should actually be
        available for
                 stack frames.
                 Hotspot should be fixed, but it's not easy.


             Do you mean that the value specified at the Java level
        should be
             rounded up to accommodate guard pages etc at the native level?

             David
             -----


                 On Mon, Dec 14, 2015 at 12:47 PM, David Holmes
                 <david.hol...@oracle.com
        <mailto:david.hol...@oracle.com> <mailto:david.hol...@oracle.com
        <mailto:david.hol...@oracle.com>>> wrote:

                     On 14/12/2015 11:06 PM, cheleswer sahu wrote:


                         Hi David,
                         TLS is thread local storage. In test program it is
                         defined using

                         #define TLS_SIZE 32
                         int __thread  XYZ[TLS_SIZE * 1024];



                     Thanks for clarifying. What test is that? I'm
        guessing this
                     may be a linux
                     only test? Which platform do you see the problem on?

                     We don't unconditionally use compiler-based TLS as some
                     platforms may not
                     support it.

                     That aside that declaration should really be static
        I think.

                     David
                     -----


                         Regards,
                         Cheleswer
                         On 12/14/2015 6:29 PM, David Holmes wrote:


                             What is TLS in this context?

                             Thanks,
                             David

                             On 14/12/2015 10:34 PM, cheleswer sahu wrote:


                                 Hi,

                                 I am investigating an issue, in which
        test with
                                 TLS size set to 32K is
                                 failing with StackOverFlowError. During
                                 investigation I found the below
                                 code

        
http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/tip/src/solaris/classes/java/lang/UNIXProcess.java



                                     ThreadFactory threadFactory =
        grimReaper -> {
                                                    // Our thread stack
                                 requirement is quite modest.
                                                    Thread t = new
                                 Thread(systemThreadGroup, grimReaper,

                                 "process reaper", 32768);

                                 Here reaper thread is created with
        fixed stack
                                 size "32768 ", which
                                 causes StackOverFlowError  when TLS is
        set to
                                 32k around.
                                 If I remove this fixed size and make it
        default,
                                 test works fine.

                                 Thread t = new
        Thread(systemThreadGroup, grimReaper,

                                 "process reaper");

                                 I have run several test with TLS size
        32k , 64k
                                 ,128k and more .
                                 The interesting part, it works well
        with 64k and
                                 128k TLS size but not
                                 with 32k.
                                 So my questions are as follows:


                                     What is the motivation behind the fixed
                                     thread stack size ?
                                     will it be ok to replace the fixed
        stack
                                     size with default or stack


                                 size setting is platform sensitive?


                                     How TLS sizes are interpreted
        internally,
                                     which allows 64k and 128k


                                 to work but not to 32k ?

                                 I would really appreciate, if anyone
        have any
                                 opinion on this.

                                 Regards,
                                 Cheleswer







Reply via email to