On 16/09/2022 12:19, Thomas Neumann via Gcc-patches wrote:
The __register_frame/__deregister_frame functions are used to register
unwinding frames from JITed code in a sorted list. That list itself
is protected by object_mutex, which leads to terrible performance
in multi-threaded code and is somewhat expensive even if single-threaded.
There was already a fast-path that avoided taking the mutex if no
frame was registered at all.

This commit eliminates both the mutex and the sorted list from
the atomic fast path, and replaces it with a btree that uses
optimistic lock coupling during lookup. This allows for fully parallel
unwinding and is essential to scale exception handling to large
core counts.

I haven't debugged this in any way, nor checked whether it only impacts exactly my below scenario, but noticed the following:

At least when building LibreOffice with Clang (16 trunk) with ASan and UBsan enabled against libstdc++ (with --gcc-toolchain and LD_LIBRARY_PATH to pick up a libstdc++ trunk build including this change at build and run-time), at least one of the LibreOffice tests executed during the build started to fail with

Thread 1 "cppunittester" received signal SIGABRT, Aborted.
__pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, 
no_tid=no_tid@entry=0)Downloading 0.00 MB source file 
/usr/src/debug/glibc-2.36-4.fc37.x86_64/nptl/pthread_kill.c
 at 
~/.cache/debuginfod_client/a6572cd46182057d3dbacf1685a12edab0e2eda1/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##nptl##pthread_kill.c:44
44            return INTERNAL_SYSCALL_ERROR_P (ret) ? INTERNAL_SYSCALL_ERRNO 
(ret) : 0;
(gdb) bt
#0  __pthread_kill_implementation (threadid=<optimized out>, 
signo=signo@entry=6, no_tid=no_tid@entry=0) at 
~/.cache/debuginfod_client/a6572cd46182057d3dbacf1685a12edab0e2eda1/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##nptl##pthread_kill.c:44
#1  0x00007ffff6dcdd33 in __pthread_kill_internal (signo=6, threadid=<optimized 
out>) at 
~/.cache/debuginfod_client/a6572cd46182057d3dbacf1685a12edab0e2eda1/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##nptl##pthread_kill.c:78
#2  0x00007ffff6d7daa6 in __GI_raise (sig=sig@entry=6) at 
~/.cache/debuginfod_client/a6572cd46182057d3dbacf1685a12edab0e2eda1/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##signal##..##sysdeps##posix##raise.c:26
#3  0x00007ffff6d677fc in __GI_abort () at 
~/.cache/debuginfod_client/a6572cd46182057d3dbacf1685a12edab0e2eda1/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##stdlib##abort.c:79
#4  0x00007ffff6f377e8 in __deregister_frame_info_bases (begin=<optimized out>) 
at ~/gcc/trunk/src/libgcc/unwind-dw2-fde.c:285
#5  __deregister_frame_info_bases (begin=<optimized out>) at 
~/gcc/trunk/src/libgcc/unwind-dw2-fde.c:223
#6  0x00007fffc7c3b53f in __do_fini () at 
~/lo/core/instdir/program/libcairo.so.2
#7  0x00007ffff7fcda9e in _dl_fini () at 
~/.cache/debuginfod_client/653dfb54d6e6d9c27c349f698a8af1ab86d5501d/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##elf##dl-fini.c:142
#8  0x00007ffff6d7ff35 in __run_exit_handlers (status=0, listp=0x7ffff6f13840 
<__exit_funcs>, run_list_atexit=run_list_atexit@entry=true, 
run_dtors=run_dtors@entry=true) at 
~/.cache/debuginfod_client/a6572cd46182057d3dbacf1685a12edab0e2eda1/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##stdlib##exit.c:113
#9  0x00007ffff6d800b0 in __GI_exit (status=<optimized out>) at 
~/.cache/debuginfod_client/a6572cd46182057d3dbacf1685a12edab0e2eda1/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##stdlib##exit.c:143
#10 0x00007ffff6d68517 in __libc_start_call_main (main=main@entry=0x5555556c9ef0 
<main(int, char**)>, argc=argc@entry=24, argv=argv@entry=0x7ffffffefbf8) at 
~/.cache/debuginfod_client/a6572cd46182057d3dbacf1685a12edab0e2eda1/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##csu##..##sysdeps##nptl##libc_start_call_main.h:74
#11 0x00007ffff6d685c9 in __libc_start_main_impl (main=0x5555556c9ef0 <main(int, char**)>, 
argc=24, argv=0x7ffffffefbf8, init=<optimized out>, fini=<optimized out>, 
rtld_fini=<optimized out>, stack_end=0x7ffffffefbe8) at 
~/.cache/debuginfod_client/a6572cd46182057d3dbacf1685a12edab0e2eda1/source##usr##src##debug##glibc-2.36-4.fc37.x86_64##csu##..##csu##libc-start.c:381
#12 0x00005555555f1575 in _start ()

and which went away again when locally reverting this <https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=6e80a1d164d1f996ad08a512c000025a7c2ca893> "eliminate mutex in fast path of __register_frame".

Reply via email to