Remove data dependency barrier from atomic_load_* functions
authorvisa <visa@openbsd.org>
Mon, 21 Mar 2022 05:45:52 +0000 (05:45 +0000)
committervisa <visa@openbsd.org>
Mon, 21 Mar 2022 05:45:52 +0000 (05:45 +0000)
This makes the atomic_load_* functions relaxed in terms of memory
ordering. Now it should be acceptable to use these functions in
assertions.

The need of the data dependency barrier is conditioned to usage.
The barrier is unnecessary for the control decisions that cond_wait()
and refcnt_finalize() make. READ_ONCE() and SMR_PTR_GET() use the
barrier so that loaded pointers would work as excepted in lock-free
contexts (some Alpha CPUs have a data cache design that can cause
unusual load-load reordering if not synchronized properly).

OK bluhm@

sys/sys/atomic.h

index 93c0e0a..f648047 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: atomic.h,v 1.8 2022/03/11 19:02:15 bluhm Exp $ */
+/*     $OpenBSD: atomic.h,v 1.9 2022/03/21 05:45:52 visa Exp $ */
 /*
  * Copyright (c) 2014 David Gwynne <dlg@openbsd.org>
  * Copyright (c) 2022 Alexander Bluhm <bluhm@openbsd.org>
@@ -201,26 +201,16 @@ atomic_sub_long_nv(volatile unsigned long *p, unsigned long v)
  * atomic_load_* - read from memory
  */
 
-static inline void membar_datadep_consumer(void);
-
 static inline unsigned int
 atomic_load_int(volatile unsigned int *p)
 {
-       unsigned int v;
-
-       v = *p;
-       membar_datadep_consumer();
-       return v;
+       return *p;
 }
 
 static inline unsigned long
 atomic_load_long(volatile unsigned long *p)
 {
-       unsigned long v;
-
-       v = *p;
-       membar_datadep_consumer();
-       return v;
+       return *p;
 }
 
 /*