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