Index: arch/amd64/include/atomic.h =================================================================== RCS file: /cvs/src/sys/arch/amd64/include/atomic.h,v retrieving revision 1.18 diff -u -p -r1.18 atomic.h --- arch/amd64/include/atomic.h 17 Aug 2016 11:56:42 -0000 1.18 +++ arch/amd64/include/atomic.h 3 May 2017 01:20:10 -0000 @@ -263,10 +263,25 @@ _atomic_sub_long_nv(volatile unsigned lo #define __membar(_f) do { __asm __volatile(_f ::: "memory"); } while (0) #ifdef MULTIPROCESSOR -#define membar_enter() __membar("mfence") -#define membar_exit() __membar("") -#define membar_producer() __membar("") -#define membar_consumer() __membar("") + +static inline void +__membar_store(void) +{ + unsigned long word; + __asm __volatile("movq $0,%0" : "=m" (word) : : "memory"); +} + +static inline void +__membar_loadstore(void) +{ + unsigned long word; + __asm __volatile("lock addq $0,%0" : "=m" (word) : : "memory"); +} + +#define membar_enter() __membar_loadstore() +#define membar_exit() __membar_store() +#define membar_producer() __membar_store() +#define membar_consumer() __membar_loadstore() #define membar_sync() __membar("mfence") #else #define membar_enter() __membar("")