diff options
-rw-r--r-- | Documentation/memory-barriers.txt | 12 | ||||
-rw-r--r-- | include/asm-alpha/barrier.h | 2 | ||||
-rw-r--r-- | include/asm-frv/system.h | 2 |
3 files changed, 13 insertions, 3 deletions
diff --git a/Documentation/memory-barriers.txt b/Documentation/memory-barriers.txt index e5a819a4f0c9..f5b7127f54ac 100644 --- a/Documentation/memory-barriers.txt +++ b/Documentation/memory-barriers.txt | |||
@@ -994,7 +994,17 @@ The Linux kernel has eight basic CPU memory barriers: | |||
994 | DATA DEPENDENCY read_barrier_depends() smp_read_barrier_depends() | 994 | DATA DEPENDENCY read_barrier_depends() smp_read_barrier_depends() |
995 | 995 | ||
996 | 996 | ||
997 | All CPU memory barriers unconditionally imply compiler barriers. | 997 | All memory barriers except the data dependency barriers imply a compiler |
998 | barrier. Data dependencies do not impose any additional compiler ordering. | ||
999 | |||
1000 | Aside: In the case of data dependencies, the compiler would be expected to | ||
1001 | issue the loads in the correct order (eg. `a[b]` would have to load the value | ||
1002 | of b before loading a[b]), however there is no guarantee in the C specification | ||
1003 | that the compiler may not speculate the value of b (eg. is equal to 1) and load | ||
1004 | a before b (eg. tmp = a[1]; if (b != 1) tmp = a[b]; ). There is also the | ||
1005 | problem of a compiler reloading b after having loaded a[b], thus having a newer | ||
1006 | copy of b than a[b]. A consensus has not yet been reached about these problems, | ||
1007 | however the ACCESS_ONCE macro is a good place to start looking. | ||
998 | 1008 | ||
999 | SMP memory barriers are reduced to compiler barriers on uniprocessor compiled | 1009 | SMP memory barriers are reduced to compiler barriers on uniprocessor compiled |
1000 | systems because it is assumed that a CPU will appear to be self-consistent, | 1010 | systems because it is assumed that a CPU will appear to be self-consistent, |
diff --git a/include/asm-alpha/barrier.h b/include/asm-alpha/barrier.h index 384dc08d6f53..ac78eba909bc 100644 --- a/include/asm-alpha/barrier.h +++ b/include/asm-alpha/barrier.h | |||
@@ -24,7 +24,7 @@ __asm__ __volatile__("mb": : :"memory") | |||
24 | #define smp_mb() barrier() | 24 | #define smp_mb() barrier() |
25 | #define smp_rmb() barrier() | 25 | #define smp_rmb() barrier() |
26 | #define smp_wmb() barrier() | 26 | #define smp_wmb() barrier() |
27 | #define smp_read_barrier_depends() barrier() | 27 | #define smp_read_barrier_depends() do { } while (0) |
28 | #endif | 28 | #endif |
29 | 29 | ||
30 | #define set_mb(var, value) \ | 30 | #define set_mb(var, value) \ |
diff --git a/include/asm-frv/system.h b/include/asm-frv/system.h index cb307f8a6b48..d3a12a9079f7 100644 --- a/include/asm-frv/system.h +++ b/include/asm-frv/system.h | |||
@@ -179,7 +179,7 @@ do { \ | |||
179 | #define mb() asm volatile ("membar" : : :"memory") | 179 | #define mb() asm volatile ("membar" : : :"memory") |
180 | #define rmb() asm volatile ("membar" : : :"memory") | 180 | #define rmb() asm volatile ("membar" : : :"memory") |
181 | #define wmb() asm volatile ("membar" : : :"memory") | 181 | #define wmb() asm volatile ("membar" : : :"memory") |
182 | #define read_barrier_depends() barrier() | 182 | #define read_barrier_depends() do { } while (0) |
183 | 183 | ||
184 | #ifdef CONFIG_SMP | 184 | #ifdef CONFIG_SMP |
185 | #define smp_mb() mb() | 185 | #define smp_mb() mb() |