diff --git a/include/os/freebsd/spl/sys/atomic.h b/include/os/freebsd/spl/sys/atomic.h index 01b13fc9afd7..8b9cec15c5e1 100644 --- a/include/os/freebsd/spl/sys/atomic.h +++ b/include/os/freebsd/spl/sys/atomic.h @@ -59,6 +59,7 @@ extern uint64_t atomic_cas_64(volatile uint64_t *target, uint64_t cmp, #define membar_consumer() atomic_thread_fence_acq() #define membar_producer() atomic_thread_fence_rel() +#define membar_sync() atomic_thread_fence_seq_cst() static __inline uint32_t atomic_add_32_nv(volatile uint32_t *target, int32_t delta) diff --git a/include/os/linux/spl/sys/vmsystm.h b/include/os/linux/spl/sys/vmsystm.h index fcd61e818fa3..c6d99fb3183d 100644 --- a/include/os/linux/spl/sys/vmsystm.h +++ b/include/os/linux/spl/sys/vmsystm.h @@ -46,6 +46,7 @@ #define membar_consumer() smp_rmb() #define membar_producer() smp_wmb() +#define membar_sync() smp_mb() #define physmem zfs_totalram_pages diff --git a/lib/libspl/atomic.c b/lib/libspl/atomic.c index ba14b113f585..8cc350710ba0 100644 --- a/lib/libspl/atomic.c +++ b/lib/libspl/atomic.c @@ -381,6 +381,12 @@ membar_exit(void) __atomic_thread_fence(__ATOMIC_SEQ_CST); } +void +membar_sync(void) +{ + __atomic_thread_fence(__ATOMIC_SEQ_CST); +} + void membar_producer(void) { diff --git a/lib/libspl/include/atomic.h b/lib/libspl/include/atomic.h index 1249d42b604a..4ebdbbda9864 100644 --- a/lib/libspl/include/atomic.h +++ b/lib/libspl/include/atomic.h @@ -313,6 +313,13 @@ extern void membar_enter(void); */ extern void membar_exit(void); +/* + * Make all stores and loads emitted prior to the the barrier complete before + * crossing it, while also making sure stores and loads emitted after the + * barrier only start being executed after crossing it. + */ +extern void membar_sync(void); + /* * Arrange that all stores issued before this point in the code reach * global visibility before any stores that follow; useful in producer