Commit 891c9d56 authored by Russell King's avatar Russell King Committed by Linus Torvalds

[PATCH] set_task_state() UP memory barriers

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.)
parent 367c4639
...@@ -52,6 +52,8 @@ extern asmlinkage void __backtrace(void); ...@@ -52,6 +52,8 @@ extern asmlinkage void __backtrace(void);
#define mb() __asm__ __volatile__ ("" : : : "memory") #define mb() __asm__ __volatile__ ("" : : : "memory")
#define rmb() mb() #define rmb() mb()
#define wmb() 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 nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t");
#define prepare_to_switch() do { } while(0) #define prepare_to_switch() do { } while(0)
......
...@@ -150,6 +150,8 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size) ...@@ -150,6 +150,8 @@ static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
#define mb() __asm__ __volatile__ ("" : : : "memory") #define mb() __asm__ __volatile__ ("" : : : "memory")
#define rmb() mb() #define rmb() mb()
#define wmb() 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 #ifdef CONFIG_SMP
#define smp_mb() mb() #define smp_mb() mb()
......
...@@ -120,6 +120,8 @@ static inline void set_eiem(unsigned long val) ...@@ -120,6 +120,8 @@ static inline void set_eiem(unsigned long val)
#define mb() __asm__ __volatile__ ("sync" : : :"memory") #define mb() __asm__ __volatile__ ("sync" : : :"memory")
#define wmb() 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)
extern unsigned long __xchg(unsigned long, unsigned long *, int); extern unsigned long __xchg(unsigned long, unsigned long *, int);
......
...@@ -106,23 +106,13 @@ extern unsigned long nr_uninterruptible(void); ...@@ -106,23 +106,13 @@ extern unsigned long nr_uninterruptible(void);
#define __set_task_state(tsk, state_value) \ #define __set_task_state(tsk, state_value) \
do { (tsk)->state = (state_value); } while (0) do { (tsk)->state = (state_value); } while (0)
#ifdef CONFIG_SMP
#define set_task_state(tsk, state_value) \ #define set_task_state(tsk, state_value) \
set_mb((tsk)->state, (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) \ #define __set_current_state(state_value) \
do { current->state = (state_value); } while (0) do { current->state = (state_value); } while (0)
#ifdef CONFIG_SMP
#define set_current_state(state_value) \ #define set_current_state(state_value) \
set_mb(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 * Scheduling policies
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment