FRV: Don't make smp_{r, w, }mb() interpolate MEMBAR when CONFIG_SMP=n [try #2]
authorDavid Howells <dhowells@redhat.com>
Thu, 10 Apr 2008 15:11:05 +0000 (16:11 +0100)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 10 Apr 2008 20:41:29 +0000 (13:41 -0700)
Don't make smp_{r,w,}mb() interpolate a MEMBAR instruction when CONFIG_SMP=n as
SMP memory barries on UP systems should interpolate a compiler barrier only.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/asm-frv/system.h

index 2c57f473474641d50942f615344c3daf5debea97..30a67a9da11ae88f7754bb09512940204787ba7d 100644 (file)
@@ -179,14 +179,23 @@ do {                                                      \
 #define mb()                   asm volatile ("membar" : : :"memory")
 #define rmb()                  asm volatile ("membar" : : :"memory")
 #define wmb()                  asm volatile ("membar" : : :"memory")
-#define set_mb(var, value)     do { var = value; mb(); } while (0)
+#define read_barrier_depends() barrier()
 
-#define smp_mb()               mb()
-#define smp_rmb()              rmb()
-#define smp_wmb()              wmb()
-
-#define read_barrier_depends()         do {} while(0)
+#ifdef CONFIG_SMP
+#define smp_mb()                       mb()
+#define smp_rmb()                      rmb()
+#define smp_wmb()                      wmb()
 #define smp_read_barrier_depends()     read_barrier_depends()
+#define set_mb(var, value) \
+       do { xchg(&var, (value)); } while (0)
+#else
+#define smp_mb()                       barrier()
+#define smp_rmb()                      barrier()
+#define smp_wmb()                      barrier()
+#define smp_read_barrier_depends()     do {} while(0)
+#define set_mb(var, value) \
+       do { var = (value); barrier(); } while (0)
+#endif
 
 #define HARD_RESET_NOW()                       \
 do {                                           \