diff --git a/include/asm-x86/system_32.h b/include/asm-x86/system_32.h
index 8b15bd3057c9b3c4c5ce844e35638396048ab46e..e7e5d426fef58c2b6892fea59c341528d827afaf 100644
--- a/include/asm-x86/system_32.h
+++ b/include/asm-x86/system_32.h
@@ -274,7 +274,11 @@ static inline unsigned long get_limit(unsigned long segment)
 
 #ifdef CONFIG_SMP
 #define smp_mb()	mb()
-#define smp_rmb()	rmb()
+#ifdef CONFIG_X86_PPRO_FENCE
+# define smp_rmb()	rmb()
+#else
+# define smp_rmb()	barrier()
+#endif
 #ifdef CONFIG_X86_OOSTORE
 # define smp_wmb() 	wmb()
 #else
diff --git a/include/asm-x86/system_64.h b/include/asm-x86/system_64.h
index eff730b1192682ca85875e909dda13bb1f7e49d9..5022aecc333d7bfe6b24037b3927f15e745e4d7a 100644
--- a/include/asm-x86/system_64.h
+++ b/include/asm-x86/system_64.h
@@ -141,8 +141,8 @@ static inline void write_cr8(unsigned long val)
 
 #ifdef CONFIG_SMP
 #define smp_mb()	mb()
-#define smp_rmb()	rmb()
-#define smp_wmb()	wmb()
+#define smp_rmb()	barrier()
+#define smp_wmb()	barrier()
 #define smp_read_barrier_depends()	do {} while(0)
 #else
 #define smp_mb()	barrier()