atomic: add atomic_interrupt_fence()

with the semantic following C11 signal_fence, that is, it establishes
ordering between its place and any interrupt handler executing on the
same CPU.

Reviewed by:	markj, mjg, rlibby
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D28909
This commit is contained in:
Konstantin Belousov 2021-02-24 00:12:29 +02:00
parent 43d4dfac96
commit e2494f7561
2 changed files with 14 additions and 1 deletions

View File

@ -22,7 +22,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd August 18, 2019
.Dd February 24, 2021
.Dt ATOMIC 9
.Os
.Sh NAME
@ -31,6 +31,7 @@
.Nm atomic_cmpset ,
.Nm atomic_fcmpset ,
.Nm atomic_fetchadd ,
.Nm atomic_interrupt_fence ,
.Nm atomic_load ,
.Nm atomic_readandclear ,
.Nm atomic_set ,
@ -59,6 +60,8 @@
.Fc
.Ft <type>
.Fn atomic_fetchadd_<type> "volatile <type> *p" "<type> v"
.Ft void
.Fn atomic_interrupt_fence "void"
.Ft <type>
.Fn atomic_load_[acq_]<type> "volatile <type> *p"
.Ft <type>
@ -292,6 +295,14 @@ release stores, by separating access from ordering, they can sometimes
facilitate more efficient implementations of synchronization primitives.
For example, they can be used to avoid executing a memory barrier until a
memory access shows that some condition is satisfied.
.Ss Interrupt Fence Operations
The
.Fn atomic_interrupt_fence()
function establishes ordering between its call location and any interrupt
handler executing on the same CPU.
It is modeled after the similar C11 function
.Fn atomic_signal_fence() ,
and adapted for the kernel environment.
.Ss Multiple Processors
In multiprocessor systems, the atomicity of the atomic operations on memory
depends on support for cache coherence in the underlying architecture.

View File

@ -78,4 +78,6 @@
#define atomic_load_consume_ptr(p) \
((__typeof(*p)) atomic_load_acq_ptr((uintptr_t *)p))
#define atomic_interrupt_fence() __compiler_membar()
#endif