[PATCH 1/2] tls: Add debug logging for TLS and TCB management
Frederic Berat
fberat@redhat.com
Wed Oct 22 16:12:35 GMT 2025
On Wed, Oct 22, 2025 at 4:18 AM DJ Delorie <dj@redhat.com> wrote:
>
> Overall OK if you can reasonably discount my last two comments ;-)
>
> Frédéric Bérat <fberat@redhat.com> writes:
> > + else if (__glibc_unlikely (GLRO (dl_debug_mask) & DL_DEBUG_TLS))
> > + _dl_debug_printf ("TCB allocated: 0x%lx\n", (unsigned long int)
> result);
>
> Ideally this should be %p for pointers and the cast wouldn't be needed.
> However, _dl_debug_printf doesn't support that :-(
>
> > diff --git a/nptl/nptl-stack.c b/nptl/nptl-stack.c
> > index c049c5133c..c8f2b3505f 100644
> > --- a/nptl/nptl-stack.c
> > +++ b/nptl/nptl-stack.c
> > @@ -77,6 +77,10 @@ __nptl_free_stacks (size_t limit)
> >
> > /* Free the memory associated with the ELF TLS. */
> > _dl_deallocate_tls (TLS_TPADJ (curr), false);
> > + if (__glibc_unlikely (GLRO (dl_debug_mask) & DL_DEBUG_TLS))
> > + GLRO (dl_debug_printf) (
> > + "TCB cache full, deallocating: TID=%ld, TCB=0x%lx\n",
> > + (long int) curr->tid, (unsigned long int) curr);
>
> In general, when deallocating or destroying things, you should put the
> prints before the calls in case the information you want to print is
> lost during the deallocation/destruction. In *this* case it's safe, but
> it might not have been.
>
> > @@ -99,6 +103,9 @@ queue_stack (struct pthread *stack)
> > /* We unconditionally add the stack to the list. The memory may
> > still be in use but it will not be reused until the kernel marks
> > the stack as not used anymore. */
> > + if (__glibc_unlikely (GLRO (dl_debug_mask) & DL_DEBUG_TLS))
> > + GLRO (dl_debug_printf) ("TCB deallocated into cache: TID=%ld,
> TCB=0x%lx\n",
> > + (long int) stack->tid, (unsigned long int)
> stack);
>
> The text says TCB= but the value is the tcb's stack? It's actually
> right, but the variable name is misleading...
>
> > diff --git a/nptl/tst-dl-debug-tid.c b/nptl/tst-dl-debug-tid.c
> > + /* Give the detached thread time to finish. */
> > + sleep (1);
>
> This is known to be unreliable on heavily loaded systems, and wastes a
> whole second on lightly loaded ones. Is there any other way to
> busy-wait or syscall to detect the non-existence of that thread?
>
Not that I can think of, but I'm open to proposals.
One thing I may do is to create the detached thread first and assume it
will be done by the time the attached thread is, but that's kind of
unreliable too.
>
> > diff --git a/nptl/tst-dl-debug-tid.sh b/nptl/tst-dl-debug-tid.sh
> > +# Arguments are from Makefile.
> > +common_objpfx=$1
> > +test_wrapper=$2
> > +rtld_prefix=$3
> > +test_wrapper_env=$4
> > +run_program_env=$5
> > +test_program=$6
>
> These should be quoted, as well as their uses below. Most are safe but
> in case the user builds in a directory with spaces :-P
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20251022/a724f4f0/attachment-0001.htm>
More information about the Libc-alpha
mailing list