On Wed, Jan 15, 2025 at 12:19:08AM +0200, Konstantin Belousov wrote:
> On Tue, Jan 14, 2025 at 03:42:52PM -0500, Mark Johnston wrote:
> > On Tue, Jan 14, 2025 at 05:55:15PM +0000, Konstantin Belousov wrote:
> > > The branch main has been updated by kib:
> > >
> > > URL: 
> > > https://cgit.FreeBSD.org/src/commit/?id=9a2ae72421cd75c741984f63b8c9ee89346a188d
> > >
> > > commit 9a2ae72421cd75c741984f63b8c9ee89346a188d
> > > Author:     Konstantin Belousov <k...@freebsd.org>
> > > AuthorDate: 2025-01-14 09:06:58 +0000
> > > Commit:     Konstantin Belousov <k...@freebsd.org>
> > > CommitDate: 2025-01-14 17:55:08 +0000
> > >
> > >     libthr: switch thread and sleepq memory allocator to crt from libc 
> > > malloc
> > >
> > >     There are more complex interactions between malloc and libthr
> > >     initialization that can happen if libthr functions are called from ELF
> > >     object' constructors, before libthr is initialized.  Break the
> > >     dependencies loop by using the private allocator with controlled init.
> > >
> > >     Reported by:    yuri
> > >     Reviewed by:    markj, olce
> > >     Sponsored by:   The FreeBSD Foundation
> > >     MFC after:      1 week
> > >     Differential revision:  https://reviews.freebsd.org/D48454
> > 
> > I see some startup deadlock when running the googletest regression tests
> > (/usr/tests/lib/googletest/gmock_main) after this commit.  gdb (which
> > itself also hangs due to this bug) shows:
> > 
> > (gdb) bt
> > #0  _umtx_op_err () at 
> > /home/markj/sb/main/src/lib/libsys/amd64/_umtx_op_err.S:38
> > #1  0x000015e1ba96fd2c in __thr_umutex_lock (mtx=0x15e1ba974468, id=100113) 
> > at /usr/src/lib/libthr/thread/thr_umtx.c:69
> > #2  0x000015e1ba966a41 in __thr_calloc (num=1, size=17) at 
> > /usr/src/lib/libthr/thread/thr_malloc.c:92
> > #3  0x000015e1ba969213 in mutex_init (mutex=warning: (Internal error: pc 
> > 0x15e1bd5c0240 in read in CU, but not in symtab.)
> > warning: (Error: pc 0x15e1bd5c0240 in address map, but not in symtab.)
> 
> The following fixed the issue for me.  I am somewhat surprised that the
> problem did not manifested itself before.

It seems to fix the hang for me as well, thanks.

> commit 783d95d0d6e6e508705cf16cfd9e4a5e2f8db8e4
> Author: Konstantin Belousov <k...@freebsd.org>
> Date:   Wed Jan 15 00:11:48 2025 +0200
> 
>     libpthread_init(): ensure curthread == NULL until set explicitly
>     
>     Otherwise libthr::_get_curthread() returns a garbage kept there from
>     allocate_initial_tls(), until libthr initialization proceeds enough to
>     set initial pcb->pcb_thread.  The garbage pcb_thread was dereferenced
>     as struct pthread and some memory read as TID.  Since it was not
>     consistent between reads, thr_malloc_umtx unlock returned EPERM instead
>     of clearing the lock word.
>     
>     Reported by:    markj
>     Sponsored by:   The FreeBSD Foundation
>     MFC after:      1 week
> 
> diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c
> index 708c425d69c1..e5e438897dee 100644
> --- a/lib/libthr/thread/thr_init.c
> +++ b/lib/libthr/thread/thr_init.c
> @@ -334,6 +334,7 @@ _libpthread_init(struct pthread *curthread)
>       /* Set the initial thread. */
>       if (curthread == NULL) {
>               first = 1;
> +             _tcb_get()->tcb_thread = NULL;
>               /* Create and initialize the initial thread. */
>               curthread = _thr_alloc(NULL);
>               if (curthread == NULL)

Reply via email to