NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-sh3/60773: sh3 __sync_val_compare_and_swap_1 test failures



The following reply was made to PR toolchain/60773; it has been noted by GNATS.

From: Taylor R Campbell <riastradh%NetBSD.org@localhost>
To: Valery Ushakov <uwe%stderr.spb.ru@localhost>
Cc: gnats-bugs%NetBSD.org@localhost, netbsd-bugs%NetBSD.org@localhost,
	Nick Hudson <skrll%NetBSD.org@localhost>
Subject: Re: port-sh3/60773: sh3 __sync_val_compare_and_swap_1 test failures
Date: Thu, 24 Sep 2026 12:37:51 +0000

 > Date: Thu, 24 Sep 2026 15:14:33 +0300
 > From: Valery Ushakov <uwe%stderr.spb.ru@localhost>
 >=20
 > Tangential to the topic at hand, but since I had to read the code, I
 > might as well ask - why is atomic_init_testset.c statically
 > initializes the _fn variables to _up functions only immediately to set
 > them to _mp functions in __libc_atomic_init (and later set them back
 > to _up if we are on a UP system and rasctl(2) was successful)?  Any
 > reason not to init the vars to _mp directly?  _mp functions use the
 > locks array that is statically initialized, so it should be safe to
 > call them before __libc_atomic_init, shouldn't it?
 
 The code was originally added with no initializer by ad@ in 2008,
 under the assumption the constructor would always run before use, and
 the constructor started with the always-safe _mp variants before
 deciding on the basis of sysctl whether to use the cheaper _up
 variants if safe:
 
 https://mail-index.netbsd.org/source-changes/2008/02/09/msg002110.html
 https://nxr.netbsd.org/xref/src/common/lib/libc/atomic/atomic_init_testset.=
 c?r=3D1.1#63
 
 skrll@ added the initializer because the constructor didn't always run
 before use, but it's unclear why he chose _up:
 
 https://mail-index.netbsd.org/source-changes/2009/01/30/msg216500.html
 https://nxr.netbsd.org/xref/src/common/lib/libc/atomic/atomic_init_testset.=
 c?r=3D1.6#63
 
 This actually caused some trouble for us later on with the _up
 variants getting inadvertently used in ld.elf_so until martin@ changed
 it to call __libc_atomic_init in 2023:
 
 PR lib/57628: multithread programs may deadlock in ld.elf_so (sparc on
 sparc64)
 https://gnats.NetBSD.org/57628
 https://mail-index.netbsd.org/source-changes/2023/10/03/msg147830.html
 https://nxr.netbsd.org/xref/src/libexec/ld.elf_so/rtld.c?r=3D1.216#72
 
 > If there's a reason why it's done in this way, it probably warrants a
 > comment.
 
 I think the reason is `hysterical raisins' and this warrants a commit
 to make the static initializers use _mp and then delete the
 now-redundant initial assignments in __libc_atomic_init.
 



Home | Main Index | Thread Index | Old Index