RFR: 8225035: Thread stack size issue caused by large TLS size

Jiangli Zhou jianglizhou at google.com
Thu Jun 27 16:35:54 UTC 2019


Hi Florian,

On Thu, Jun 27, 2019 at 9:23 AM Florian Weimer <fweimer at redhat.com> wrote:
>
> * Jiangli Zhou:
>
> > Hi Florian,
> >
> > On Thu, Jun 27, 2019 at 8:14 AM Florian Weimer <fweimer at redhat.com> wrote:
> >>
> >> * Jiangli Zhou:
> >>
> >> > On Thu, Jun 27, 2019 at 12:57 AM Florian Weimer <fweimer at redhat.com> wrote:
> >> >>
> >> >> * Thomas Stüfe:
> >> >>
> >> >> >> I think
> >> >> >>
> >> >> >>   stack_adjust_size += guard_size;
> >> >> >>
> >> >> >> is redundant with the get_minstack-based adjustment because it is either
> >> >> >> included in it directly in the get_minstack value, or indirectly in the
> >> >> >> updated stack size computation in glibc (where it adds the guard size
> >> >> >> internally).
> >> >> >
> >> >> > Please do not change this!
> >> >> >
> >> >> > To me and I guess many others it is very important that nothing at all
> >> >> > changes if this workaround is off.
> >> >>
> >> >> That has already happened because recent glibc adds the guard size to
> >> >> the stack size internally now.
> >> >>
> >> >> But what I meant: only perform the += adjustment above for the
> >> >> !AdjustStackSizeForTLS case.
> >> >
> >> > I'm reluctant to do that, because it adds additional dependencies on
> >> > the glibc implementation. Subtracting the non-TLS size from the value
> >> > returned by __pthread_get_minstack may not be forward compatible in
> >> > the future when __pthread_get_minstack changes. I agree with Thomas to
> >> > keep the workaround as simple as possible.
> >>
> >> Even though it is an internal interface, __pthread_get_minstack will not
> >> change its competition.  It will be removed if glibc switches to
> >> allocating the TCB and TLS data off the stack.  But that that point, the
> >> size adjustment for TLS will no loger be necessary.
> >>
> >> PTHREAD_MIN_STACK could theoretically change (it is rather small on some
> >> architectures), but we have been extremely reluctant to make that
> >> change, due to dependencies like this one.  Rather, we have made the
> >> effective available stack size larger by other means, for the same value
> >> of PTHREAD_MIN_STACK.  (By not subtracting the guard size, in
> >> particular, and we also avoid calls in to the dynamic loader in more
> >> cases, which tend to require lots of stack space on several
> >> architectures.)
> >
> > I think the issue is if we subtract PTHREAD_STACK_MIN, do we want to
> > also subtract the _dl_pagesize? For glibc implementation older than
> > 2.27, do we need to handle the case for the guardsize separately? If
> > we do that, we would need conditional code to handle different glibc
> > versions. That seems to be worse than the approach of going with
> > _dl_get_tls_static_info??
>
> I think you can handle the guard size in this way:
>
>   pthread_attr_setguardsize(&attr, guard_size);
>
>   size_t stack_adjust_size = 0;
>   if (AdjustStackSizeForTLS) {
>     size_t minstack_size = get_minstack(&attr);
>     size_t tls_size = minstack_size - vm_page_size() - PTHREAD_STACK_MIN;
>     // In glibc before 2.27, tls_size still includes guard_size.
>     // In glibc 2.27 and later, guard_size is automatically
>     // added to the stack size by pthread_create.
>     // In both cases, the guard size is taken into account.
>     stack_adjust_size += tls_size;
>   } else {
>     stack_adjust_size += guard_size;
>   }

Is the vm_page_size() counted for the dl_pagesize? As long as others
are okay with the above suggested adjustment, it looks good to me.
Thomas, David and others, any objection?

Thanks and best regards,
Jiangli
>
> Thanks,
> Florian


More information about the hotspot-runtime-dev mailing list