[PATCH 00/22] Cleanup internal atomic definitions
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Thu Sep 11 17:09:11 GMT 2025
On 11/09/25 12:27, Uros Bizjak wrote:
> On Thu, Sep 11, 2025 at 3:52 PM Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>> This patchset is based on previous work by Wilco [1] [2] to move all
>> targets' C11 atomics and remove the unused and redundant atomic
>> definitions.
>>
>> I took a more conservative approach and kept some arch-specific
>> definitions on some targets:
>>
>> * alpha uses a ‘wmb’ for the atomic_write_barrier, and the instruction
>> does not map to any C11 memory ordering. Alpha has a peculiar
>> semantic memory, so it's best to keep it.
>>
>> * sparc also defines stronger definitions for all barriers. I am not
>> sure why a strong ordering was used, nor do I have a Sparc machine
>> readily available to check if replacing it with a C11 barrier would
>> be okay, so I will keep it.
>>
>> * RISC-V defines optimized atomic_max and atomic_min, which are used in
>> some statistical collection on malloc. It also defines an
>> atomic_spin_nop, used on pthread spinlocks and adaptive mutexes.
>>
>> * x86 defines an atomic_spin_nop.
>>
>> [1] https://sourceware.org/pipermail/libc-alpha/2022-July/140817.html
>> [2] https://sourceware.org/pipermail/libc-alpha/2022-July/140817.html
>>
>> Adhemerval Zanella (20):
>> aarch64: Remove ununsed atomic macros
>
> Typo: *unused* here and below.
>
Ack.
>> arc: Remove ununsed atomic macros
>> csky: Remove ununsed atomic macros
>> mips: Remove ununsed atomic macros
>> or1k: Remove ununsed atomic macros
>> s390: Remove ununsed atomic macros
>> sparc: Remove ununsed atomic macros
>> x86: Remove ununsed atomic macros
>> arm: Consolidade atomic-machine.h and Remove ununsed atomic macros
>
> Typo: *Consolidate* here and below.
>
Ack.
>> hppa: Move atomic-machine to generic sysdep
>> m68k: Consolidade atomic-machine.h and Remove ununsed atomic macros
>> loongarch: Consolidate atomic-machine.h and remove ununsed atomic
>> macros
>> powerpc: Consolidate atomic-machine.h
>> riscv: Consolidade atomic-machine.h and remove ununsed atomic macros
>> sh: Move atomic-machine to generic sysdep
>> alpha: Remove USE_ATOMIC_COMPILER_BUILTINS definition
>> microblaze: Remove USE_ATOMIC_COMPILER_BUILTINS definition
>> atomic: Consolidate atomic_full_barrier implementation
>> atomic: Consolidate atomic_read_barrier implementation
>> atomic: Consolidate atomic_write_barrier implementation
>>
>> Wilco Dijkstra (2):
>> Define __HAVE_64B_ATOMICS from compiler support
>> nptl: Remove ATOMIC_EXCHANGE_USES_CAS usage
>
> Hello Adhemerval!
>
> A patch, following removals of unused target atomic macros could
> remove #undefs from <include/atomic.h>:
>
> # undef atomic_compare_and_exchange_val_acq
> # undef atomic_compare_and_exchange_val_rel
> # undef atomic_compare_and_exchange_bool_acq
Ack, will do.
>
> Also, I wonder what is the purpose of:
>
> # define atomic_forced_read(x) \
> ({ __typeof (x) __x; __asm ("" : "=r" (__x) : "0" (x)); __x; })
>
> This is *not* a scheduling barrier to prevent the compiler from
> reordering memory accesses (let alone the CPU), because it lacks
> "memory" clobber and/or volatile qualifier. To guarantee read to a
> register, this asm should use "memory" clobber, or it should be
> redefined to use atomic_load_acquire().
As Wilco's pointed out, this comes from an era where multiprocessor
was not the rule, and the C memory model was not well modeled. So we
have this subpar atomic code.
More information about the Libc-alpha
mailing list