Add membar_sync
Provides the missing full barrier variant to the membar primitive set. While not used right now, this is probably going to change down the road. Name taken from Solaris, to follow the existing routines. Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Mateusz Guzik <mjguzik@gmail.com> Closes #13907
This commit is contained in:
parent
62e2a2881f
commit
402426c7d8
|
@ -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_consumer() atomic_thread_fence_acq()
|
||||||
#define membar_producer() atomic_thread_fence_rel()
|
#define membar_producer() atomic_thread_fence_rel()
|
||||||
|
#define membar_sync() atomic_thread_fence_seq_cst()
|
||||||
|
|
||||||
static __inline uint32_t
|
static __inline uint32_t
|
||||||
atomic_add_32_nv(volatile uint32_t *target, int32_t delta)
|
atomic_add_32_nv(volatile uint32_t *target, int32_t delta)
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
|
|
||||||
#define membar_consumer() smp_rmb()
|
#define membar_consumer() smp_rmb()
|
||||||
#define membar_producer() smp_wmb()
|
#define membar_producer() smp_wmb()
|
||||||
|
#define membar_sync() smp_mb()
|
||||||
|
|
||||||
#define physmem zfs_totalram_pages
|
#define physmem zfs_totalram_pages
|
||||||
|
|
||||||
|
|
|
@ -381,6 +381,12 @@ membar_exit(void)
|
||||||
__atomic_thread_fence(__ATOMIC_SEQ_CST);
|
__atomic_thread_fence(__ATOMIC_SEQ_CST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
membar_sync(void)
|
||||||
|
{
|
||||||
|
__atomic_thread_fence(__ATOMIC_SEQ_CST);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
membar_producer(void)
|
membar_producer(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -313,6 +313,13 @@ extern void membar_enter(void);
|
||||||
*/
|
*/
|
||||||
extern void membar_exit(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
|
* Arrange that all stores issued before this point in the code reach
|
||||||
* global visibility before any stores that follow; useful in producer
|
* global visibility before any stores that follow; useful in producer
|
||||||
|
|
Loading…
Reference in New Issue