Module Name: src
Committed By: snj
Date: Wed Mar 18 07:47:29 UTC 2015
Modified Files:
src/common/lib/libc/arch/alpha/atomic [netbsd-7]: membar_ops.S
src/lib/libc/atomic [netbsd-7]: membar_ops.3
src/sys/arch/alpha/include [netbsd-7]: types.h
src/sys/sys [netbsd-7]: atomic.h
Log Message:
Pull up following revision(s) (requested by riastradh in ticket #600):
common/lib/libc/arch/alpha/atomic/membar_ops.S: revision 1.7
lib/libc/atomic/membar_ops.3: revision 1.4
sys/arch/alpha/include/types.h: revision 1.50
sys/sys/atomic.h: revision 1.13
Introduce membar_datadep_consumer.
Discussed briefly on tech-kern without objection:
https://mail-index.netbsd.org/tech-kern/2014/11/20/msg018054.html
https://mail-index.netbsd.org/tech-kern/2015/01/07/msg018326.html
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.6.40.1 \
src/common/lib/libc/arch/alpha/atomic/membar_ops.S
cvs rdiff -u -r1.3 -r1.3.22.1 src/lib/libc/atomic/membar_ops.3
cvs rdiff -u -r1.49 -r1.49.22.1 src/sys/arch/alpha/include/types.h
cvs rdiff -u -r1.12 -r1.12.4.1 src/sys/sys/atomic.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/common/lib/libc/arch/alpha/atomic/membar_ops.S
diff -u src/common/lib/libc/arch/alpha/atomic/membar_ops.S:1.6 src/common/lib/libc/arch/alpha/atomic/membar_ops.S:1.6.40.1
--- src/common/lib/libc/arch/alpha/atomic/membar_ops.S:1.6 Sun May 25 15:56:11 2008
+++ src/common/lib/libc/arch/alpha/atomic/membar_ops.S Wed Mar 18 07:47:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: membar_ops.S,v 1.6 2008/05/25 15:56:11 chs Exp $ */
+/* $NetBSD: membar_ops.S,v 1.6.40.1 2015/03/18 07:47:28 snj Exp $ */
/*-
* Copyright (c) 2006, 2007 The NetBSD Foundation, Inc.
@@ -87,3 +87,5 @@ ATOMIC_OP_ALIAS(membar_exit,_membar_sync
STRONG_ALIAS(_membar_exit,_membar_sync)
ATOMIC_OP_ALIAS(membar_consumer,_membar_sync)
STRONG_ALIAS(_membar_consumer,_membar_sync)
+ATOMIC_OP_ALIAS(membar_datadep_consumer,_membar_sync)
+STRONG_ALIAS(_membar_datadep_consumer,_membar_sync)
Index: src/lib/libc/atomic/membar_ops.3
diff -u src/lib/libc/atomic/membar_ops.3:1.3 src/lib/libc/atomic/membar_ops.3:1.3.22.1
--- src/lib/libc/atomic/membar_ops.3:1.3 Thu Apr 28 11:56:26 2011
+++ src/lib/libc/atomic/membar_ops.3 Wed Mar 18 07:47:28 2015
@@ -1,4 +1,4 @@
-.\" $NetBSD: membar_ops.3,v 1.3 2011/04/28 11:56:26 wiz Exp $
+.\" $NetBSD: membar_ops.3,v 1.3.22.1 2015/03/18 07:47:28 snj Exp $
.\"
.\" Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -27,7 +27,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd February 11, 2007
+.Dd November 20, 2014
.Dt MEMBAR_OPS 3
.Os
.Sh NAME
@@ -52,6 +52,8 @@
.Ft void
.Fn membar_consumer "void"
.Ft void
+.Fn membar_datadep_consumer "void"
+.Ft void
.Fn membar_sync "void"
.Sh DESCRIPTION
The
@@ -83,6 +85,40 @@ before any stores after the memory barri
.It Fn membar_consumer
All loads preceding the memory barrier will complete before any loads
after the memory barrier complete.
+.It Fn membar_datadep_consumer
+Same as
+.Fn membar_consumer ,
+but limited to loads of addresses dependent on prior loads, or
+.Sq data-dependent
+loads:
+.Bd -literal -offset indent
+int **pp, *p, v;
+
+p = *pp;
+membar_datadep_consumer();
+v = *p;
+consume(v);
+.Ed
+.Pp
+Does not guarantee ordering of loads in branches, or
+.Sq control-dependent
+loads -- you must use
+.Fn membar_consumer
+instead:
+.Bd -literal -offset indent
+int *ok, *p, v;
+
+if (*ok) {
+ membar_consumer();
+ v = *p;
+ consume(v);
+}
+.Ed
+.Pp
+Most CPUs do not reorder data-dependent loads (i.e., most CPUs
+guarantee that cached values are not stale in that case), so
+.Fn membar_datadep_consumer
+is a no-op on those CPUs.
.It Fn membar_sync
All loads and stores preceding the memory barrier will complete and
reach global visibility before any loads and stores after the memory
@@ -95,3 +131,7 @@ The
.Nm membar_ops
functions first appeared in
.Nx 5.0 .
+The data-dependent load barrier,
+.Fn membar_datadep_consumer ,
+first appeared in
+.Nx 7.0 .
Index: src/sys/arch/alpha/include/types.h
diff -u src/sys/arch/alpha/include/types.h:1.49 src/sys/arch/alpha/include/types.h:1.49.22.1
--- src/sys/arch/alpha/include/types.h:1.49 Wed Jan 25 18:09:13 2012
+++ src/sys/arch/alpha/include/types.h Wed Mar 18 07:47:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: types.h,v 1.49 2012/01/25 18:09:13 matt Exp $ */
+/* $NetBSD: types.h,v 1.49.22.1 2015/03/18 07:47:28 snj Exp $ */
/*-
* Copyright (c) 1990, 1993
@@ -70,6 +70,7 @@ typedef volatile int __cpu_simple_lock_
#define __HAVE_NEW_STYLE_BUS_H
#define __HAVE_ATOMIC_OPERATIONS
+#define __HAVE_MEMBAR_DATADEP_CONSUMER
#define __HAVE_CPU_COUNTER
#define __HAVE_SYSCALL_INTERN
#define __HAVE_MINIMAL_EMUL
Index: src/sys/sys/atomic.h
diff -u src/sys/sys/atomic.h:1.12 src/sys/sys/atomic.h:1.12.4.1
--- src/sys/sys/atomic.h:1.12 Fri Feb 21 15:52:53 2014
+++ src/sys/sys/atomic.h Wed Mar 18 07:47:28 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic.h,v 1.12 2014/02/21 15:52:53 martin Exp $ */
+/* $NetBSD: atomic.h,v 1.12.4.1 2015/03/18 07:47:28 snj Exp $ */
/*-
* Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
@@ -156,6 +156,12 @@ void membar_producer(void);
void membar_consumer(void);
void membar_sync(void);
+#ifdef __HAVE_MEMBAR_DATADEP_CONSUMER
+void membar_datadep_consumer(void);
+#else
+#define membar_datadep_consumer() ((void)0)
+#endif
+
__END_DECLS
#endif /* ! _SYS_ATOMIC_H_ */