]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Expand generic subword atomic primitives
authorConrad Meyer <cem@FreeBSD.org>
Wed, 25 Mar 2020 23:12:43 +0000 (23:12 +0000)
committerConrad Meyer <cem@FreeBSD.org>
Wed, 25 Mar 2020 23:12:43 +0000 (23:12 +0000)
commitca0ec73c11a7bb9ed409466e514fa5c34b6c84b5
tree1c9d3998c7f4e86682b2df777ce0de2fc29d17c4
parent9b2877353b7c371a7964825e3ab2c983d09c0a46
Expand generic subword atomic primitives

The goal of this change is to make the atomic_load_acq_{8,16},
atomic_testandset{,_acq}_long, and atomic_testandclear_long primitives
available in MI-namespace.

The second goal is to get this draft out of my local tree, as anything that
requires a full tinderbox is a big burden out of tree.  MD specifics can be
refined individually afterwards.

The generic implementations may not be ideal for your architecture; feel
free to implement better versions.  If no subword_atomic definitions are
needed, the include can be removed from your arch's machine/atomic.h.
Generic definitions are guarded by defined macros of the same name.  To
avoid picking up conflicting generic definitions, some macro defines are
added to various MD machine/atomic.h to register an existing implementation.

Include _atomic_subword.h in arm and arm64 machine/atomic.h.

For some odd reason, KCSAN only generates some versions of primitives.
Generate the _acq variants of atomic_load.*_8, atomic_load.*_16, and
atomic_testandset.*_long.  There are other questionably disabled primitives,
but I didn't run into them, so I left them alone.  KCSAN is only built for
amd64 in tinderbox for now.

Add atomic_subword implementations of atomic_load_acq_{8,16} implemented
using masking and atomic_load_acq_32.

Add generic atomic_subword implementations of atomic_testandset_long(),
atomic_testandclear_long(), and atomic_testandset_acq_long(), using
atomic_fcmpset_long() and atomic_fcmpset_acq_long().

On x86, add atomic_testandset_acq_long as an alias for
atomic_testandset_long.

Reviewed by: kevans, rlibby (previous versions both)
Differential Revision: https://reviews.freebsd.org/D22963
sys/amd64/include/atomic.h
sys/arm/include/atomic-v4.h
sys/arm/include/atomic-v6.h
sys/arm/include/atomic.h
sys/arm64/include/atomic.h
sys/i386/include/atomic.h
sys/kern/subr_csan.c
sys/powerpc/include/atomic.h
sys/sys/_atomic_subword.h
sys/sys/_cscan_atomic.h