read_barrier_depends arch fixlets

read_barrie_depends has always been a noop (not a compiler barrier) on all
architectures except SMP alpha. This brings UP alpha and frv into line with all
other architectures, and fixes incorrect documentation.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Nick Piggin and committed by Linus Torvalds 73f10281 4ef7e3e9

+13 -3
+11 -1
Documentation/memory-barriers.txt
··· 994 DATA DEPENDENCY read_barrier_depends() smp_read_barrier_depends() 995 996 997 - All CPU memory barriers unconditionally imply compiler barriers. 998 999 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,
··· 994 DATA DEPENDENCY read_barrier_depends() smp_read_barrier_depends() 995 996 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. 1008 1009 SMP memory barriers are reduced to compiler barriers on uniprocessor compiled 1010 systems because it is assumed that a CPU will appear to be self-consistent,
+1 -1
include/asm-alpha/barrier.h
··· 24 #define smp_mb() barrier() 25 #define smp_rmb() barrier() 26 #define smp_wmb() barrier() 27 - #define smp_read_barrier_depends() barrier() 28 #endif 29 30 #define set_mb(var, value) \
··· 24 #define smp_mb() barrier() 25 #define smp_rmb() barrier() 26 #define smp_wmb() barrier() 27 + #define smp_read_barrier_depends() do { } while (0) 28 #endif 29 30 #define set_mb(var, value) \
+1 -1
include/asm-frv/system.h
··· 179 #define mb() asm volatile ("membar" : : :"memory") 180 #define rmb() asm volatile ("membar" : : :"memory") 181 #define wmb() asm volatile ("membar" : : :"memory") 182 - #define read_barrier_depends() barrier() 183 184 #ifdef CONFIG_SMP 185 #define smp_mb() mb()
··· 179 #define mb() asm volatile ("membar" : : :"memory") 180 #define rmb() asm volatile ("membar" : : :"memory") 181 #define wmb() asm volatile ("membar" : : :"memory") 182 + #define read_barrier_depends() do { } while (0) 183 184 #ifdef CONFIG_SMP 185 #define smp_mb() mb()