]> git.hungrycats.org Git - linux/commitdiff
[PATCH] set_task_state() UP memory barriers
authorRussell King <rmk@arm.linux.org.uk>
Fri, 18 Oct 2002 07:36:19 +0000 (00:36 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 18 Oct 2002 07:36:19 +0000 (00:36 -0700)
This fixes the UP set_task_state and set_current_state in 2.5.43 to
ensure that we don't re-order loads around the store for setting
task->state.

This patch is from Nicolas Pitre, nico@cam.org

(As a side note - 2.4.10 also contains the same problem, but 2.2
contain the memory barrier.)

include/asm-arm/system.h
include/asm-cris/system.h
include/asm-parisc/system.h
include/linux/sched.h

index 698ad721f426a554f5155c2129549d9740651e67..c5ac7af87347a6adedc1cee6d3b581f76e337198 100644 (file)
@@ -52,6 +52,8 @@ extern asmlinkage void __backtrace(void);
 #define mb() __asm__ __volatile__ ("" : : : "memory")
 #define rmb() mb()
 #define wmb() mb()
+#define set_mb(var, value)  do { var = value; mb(); } while (0)
+#define set_wmb(var, value) do { var = value; wmb(); } while (0)
 #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t");
 
 #define prepare_to_switch()    do { } while(0)
index 240f36fc57a45eb53ecdb2d867130f5b62aaa3e5..26ab9320a0a17e8a6f94147c7d5aeb154c9d6391 100644 (file)
@@ -150,6 +150,8 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
 #define mb() __asm__ __volatile__ ("" : : : "memory")
 #define rmb() mb()
 #define wmb() mb()
+#define set_mb(var, value)  do { var = value; mb(); } while (0)
+#define set_wmb(var, value) do { var = value; wmb(); } while (0)
 
 #ifdef CONFIG_SMP
 #define smp_mb()        mb()
index b5bfb03fe1aa7cb66a2884b770ff3901838edac8..da64163f9ee25827e5d6a5f8b53c3a76ac6a5c1f 100644 (file)
@@ -120,6 +120,8 @@ static inline void set_eiem(unsigned long val)
 
 #define mb()  __asm__ __volatile__ ("sync" : : :"memory")
 #define wmb() mb()
+#define set_mb(var, value)  do { var = value; mb(); } while (0)
+#define set_wmb(var, value) do { var = value; wmb(); } while (0)
 
 extern unsigned long __xchg(unsigned long, unsigned long *, int);
 
index 764a3ebf3c24573e67c24527123fe794edb55288..b5e63d8ade251f92e9375ec2e61eae8863888012 100644 (file)
@@ -106,23 +106,13 @@ extern unsigned long nr_uninterruptible(void);
 
 #define __set_task_state(tsk, state_value)             \
        do { (tsk)->state = (state_value); } while (0)
-#ifdef CONFIG_SMP
 #define set_task_state(tsk, state_value)               \
        set_mb((tsk)->state, (state_value))
-#else
-#define set_task_state(tsk, state_value)               \
-       __set_task_state((tsk), (state_value))
-#endif
 
 #define __set_current_state(state_value)                       \
        do { current->state = (state_value); } while (0)
-#ifdef CONFIG_SMP
 #define set_current_state(state_value)         \
        set_mb(current->state, (state_value))
-#else
-#define set_current_state(state_value)         \
-       __set_current_state(state_value)
-#endif
 
 /*
  * Scheduling policies