diff --git a/bsd/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c b/bsd/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.cc similarity index 67% rename from bsd/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c rename to bsd/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.cc index d05c41326c9a02a205e0b9a3ce6d99dc762d4b54..c9d6c3c274685b35e8ee13002475146df3b15309 100644 --- a/bsd/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c +++ b/bsd/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.cc @@ -25,45 +25,26 @@ */ #include <sys/cdefs.h> +#include <bsd/sys/cddl/compat/opensolaris/sys/atomic.h> +#include <atomic> -#include <sys/param.h> -#include <sys/lock.h> -#include <sys/mutex.h> -#include <sys/atomic.h> - -#include <bsd/porting/sync_stub.h> - -struct mtx atomic_mtx; // assume we do not need to initialize it in OSv - -#if !defined(__LP64__) && !defined(__mips_n32) -void -atomic_add_64(volatile uint64_t *target, int64_t delta) +template <typename T> +inline +volatile std::atomic<T>* as_atomic(volatile T* p) { - - mtx_lock(&atomic_mtx); - *target += delta; - mtx_unlock(&atomic_mtx); + return reinterpret_cast<volatile std::atomic<T>*>(p); } void -atomic_dec_64(volatile uint64_t *target) +atomic_add_64(volatile uint64_t *target, int64_t delta) { - - mtx_lock(&atomic_mtx); - *target -= 1; - mtx_unlock(&atomic_mtx); + as_atomic(target)->fetch_add(delta, std::memory_order_relaxed); } -#endif uint64_t atomic_add_64_nv(volatile uint64_t *target, int64_t delta) { - uint64_t newval; - - mtx_lock(&atomic_mtx); - newval = (*target += delta); - mtx_unlock(&atomic_mtx); - return (newval); + return as_atomic(target)->fetch_add(delta, std::memory_order_relaxed) + delta; } #if defined(__powerpc__) || defined(__arm__) || defined(__mips__) @@ -79,42 +60,25 @@ atomic_or_8(volatile uint8_t *target, uint8_t value) uint8_t atomic_or_8_nv(volatile uint8_t *target, uint8_t value) { - uint8_t newval; - - mtx_lock(&atomic_mtx); - newval = (*target |= value); - mtx_unlock(&atomic_mtx); - return (newval); + return as_atomic(target)->fetch_or(value, std::memory_order_relaxed) | value; } uint64_t atomic_cas_64(volatile uint64_t *target, uint64_t cmp, uint64_t newval) { - uint64_t oldval; - - mtx_lock(&atomic_mtx); - oldval = *target; - if (oldval == cmp) - *target = newval; - mtx_unlock(&atomic_mtx); - return (oldval); + as_atomic(target)->compare_exchange_strong(cmp, newval, std::memory_order_relaxed); + return cmp; } uint32_t atomic_cas_32(volatile uint32_t *target, uint32_t cmp, uint32_t newval) { - uint32_t oldval; - - mtx_lock(&atomic_mtx); - oldval = *target; - if (oldval == cmp) - *target = newval; - mtx_unlock(&atomic_mtx); - return (oldval); + as_atomic(target)->compare_exchange_strong(cmp, newval, std::memory_order_relaxed); + return cmp; } void membar_producer(void) { - /* nothing */ + std::atomic_thread_fence(std::memory_order_release); } diff --git a/bsd/sys/cddl/compat/opensolaris/sys/atomic.h b/bsd/sys/cddl/compat/opensolaris/sys/atomic.h index 5382f6e2211109fad8f1ed09bc0baa09aac99bb6..fb48b8deeeaf79412b7f1011e0f286e71455a75c 100644 --- a/bsd/sys/cddl/compat/opensolaris/sys/atomic.h +++ b/bsd/sys/cddl/compat/opensolaris/sys/atomic.h @@ -31,6 +31,9 @@ #include <sys/types.h> #include <bsd/machine/atomic.h> +#include <sys/cdefs.h> + +__BEGIN_DECLS #define casptr(_a, _b, _c) \ atomic_cmpset_ptr((volatile uintptr_t *)(_a), (uintptr_t)(_b), (uintptr_t) (_c)) @@ -133,4 +136,6 @@ atomic_cas_ptr(volatile void *target, void *cmp, void *newval) } #endif /* !defined(COMPAT_32BIT) && defined(__LP64__) */ +__END_DECLS + #endif /* !_OPENSOLARIS_SYS_ATOMIC_H_ */ diff --git a/build.mk b/build.mk index ac6519218035ee463ad5c271ebe07560fbd1ef2f..0fb88fded7646be4b41842aaecc216e0b3c93159 100644 --- a/build.mk +++ b/build.mk @@ -359,7 +359,7 @@ bsd/sys/%.o: COMMON += -Wno-sign-compare -Wno-narrowing -Wno-write-strings -Wno- solaris := solaris += bsd/sys/cddl/compat/opensolaris/kern/opensolaris.o -solaris += bsd/sys/cddl/contrib/opensolaris/common/atomic/${BSD_MACHINE_ARCH}/opensolaris_atomic.o +solaris += bsd/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.o solaris += bsd/sys/cddl/compat/opensolaris/kern/opensolaris_cmn_err.o solaris += bsd/sys/cddl/compat/opensolaris/kern/opensolaris_kmem.o solaris += bsd/sys/cddl/compat/opensolaris/kern/opensolaris_kobj.o