From 8c9cce04321bd8aaa23be319e6163553190f23cc Mon Sep 17 00:00:00 2001 From: Nick Piggin Date: Wed, 14 May 2008 06:35:11 +0200 Subject: [PATCH] --- yaml --- r: 96535 b: refs/heads/master c: 73f10281ea96d7e8b4fc1c5d755a7c8eb484155b h: refs/heads/master i: 96533: 8d61e54bbb228c8e591198ddb61e85b4b4812d43 96531: 76e9ecd6eb2daed4dfa8291c59a95af3f018e9f3 96527: a375be34553e49138afb8a72a52cd0e4cbd15987 v: v3 --- [refs] | 2 +- trunk/Documentation/memory-barriers.txt | 12 +++++++++++- trunk/include/asm-alpha/barrier.h | 2 +- trunk/include/asm-frv/system.h | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 623f1779a5ca..3116da190e0f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4ef7e3e90f56c74b2a17e12d49ed35c3767d66c2 +refs/heads/master: 73f10281ea96d7e8b4fc1c5d755a7c8eb484155b diff --git a/trunk/Documentation/memory-barriers.txt b/trunk/Documentation/memory-barriers.txt index e5a819a4f0c9..f5b7127f54ac 100644 --- a/trunk/Documentation/memory-barriers.txt +++ b/trunk/Documentation/memory-barriers.txt @@ -994,7 +994,17 @@ The Linux kernel has eight basic CPU memory barriers: DATA DEPENDENCY read_barrier_depends() smp_read_barrier_depends() -All CPU memory barriers unconditionally imply compiler barriers. +All memory barriers except the data dependency barriers imply a compiler +barrier. Data dependencies do not impose any additional compiler ordering. + +Aside: In the case of data dependencies, the compiler would be expected to +issue the loads in the correct order (eg. `a[b]` would have to load the value +of b before loading a[b]), however there is no guarantee in the C specification +that the compiler may not speculate the value of b (eg. is equal to 1) and load +a before b (eg. tmp = a[1]; if (b != 1) tmp = a[b]; ). There is also the +problem of a compiler reloading b after having loaded a[b], thus having a newer +copy of b than a[b]. A consensus has not yet been reached about these problems, +however the ACCESS_ONCE macro is a good place to start looking. SMP memory barriers are reduced to compiler barriers on uniprocessor compiled systems because it is assumed that a CPU will appear to be self-consistent, diff --git a/trunk/include/asm-alpha/barrier.h b/trunk/include/asm-alpha/barrier.h index 384dc08d6f53..ac78eba909bc 100644 --- a/trunk/include/asm-alpha/barrier.h +++ b/trunk/include/asm-alpha/barrier.h @@ -24,7 +24,7 @@ __asm__ __volatile__("mb": : :"memory") #define smp_mb() barrier() #define smp_rmb() barrier() #define smp_wmb() barrier() -#define smp_read_barrier_depends() barrier() +#define smp_read_barrier_depends() do { } while (0) #endif #define set_mb(var, value) \ diff --git a/trunk/include/asm-frv/system.h b/trunk/include/asm-frv/system.h index cb307f8a6b48..d3a12a9079f7 100644 --- a/trunk/include/asm-frv/system.h +++ b/trunk/include/asm-frv/system.h @@ -179,7 +179,7 @@ do { \ #define mb() asm volatile ("membar" : : :"memory") #define rmb() asm volatile ("membar" : : :"memory") #define wmb() asm volatile ("membar" : : :"memory") -#define read_barrier_depends() barrier() +#define read_barrier_depends() do { } while (0) #ifdef CONFIG_SMP #define smp_mb() mb()