diff options
author | Mikael Starvik <mikael.starvik@axis.com> | 2005-07-27 14:44:42 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-27 19:26:01 -0400 |
commit | 8d20a541b089ecb67a88a673548161b686ed7b85 (patch) | |
tree | 53bac804d538068c80684becb76cd76937956502 /include/asm-cris/semaphore.h | |
parent | 21783c9746619a782c21be606f6498bbd4d4615e (diff) |
[PATCH] CRIS update: SMP
Patches to support SMP.
* Each CPU has its own current_pgd.
* flush_tlb_range is implemented as flush_tlb_mm.
* Atomic operations implemented with spinlocks.
* Semaphores implemented with spinlocks.
Signed-off-by: Mikael Starvik <starvik@axis.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/asm-cris/semaphore.h')
-rw-r--r-- | include/asm-cris/semaphore.h | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/include/asm-cris/semaphore.h b/include/asm-cris/semaphore.h index 605aa7eaaaf8..8ed7636ab311 100644 --- a/include/asm-cris/semaphore.h +++ b/include/asm-cris/semaphore.h | |||
@@ -72,10 +72,9 @@ extern inline void down(struct semaphore * sem) | |||
72 | might_sleep(); | 72 | might_sleep(); |
73 | 73 | ||
74 | /* atomically decrement the semaphores count, and if its negative, we wait */ | 74 | /* atomically decrement the semaphores count, and if its negative, we wait */ |
75 | local_save_flags(flags); | 75 | cris_atomic_save(sem, flags); |
76 | local_irq_disable(); | ||
77 | failed = --(sem->count.counter) < 0; | 76 | failed = --(sem->count.counter) < 0; |
78 | local_irq_restore(flags); | 77 | cris_atomic_restore(sem, flags); |
79 | if(failed) { | 78 | if(failed) { |
80 | __down(sem); | 79 | __down(sem); |
81 | } | 80 | } |
@@ -95,10 +94,9 @@ extern inline int down_interruptible(struct semaphore * sem) | |||
95 | might_sleep(); | 94 | might_sleep(); |
96 | 95 | ||
97 | /* atomically decrement the semaphores count, and if its negative, we wait */ | 96 | /* atomically decrement the semaphores count, and if its negative, we wait */ |
98 | local_save_flags(flags); | 97 | cris_atomic_save(sem, flags); |
99 | local_irq_disable(); | ||
100 | failed = --(sem->count.counter) < 0; | 98 | failed = --(sem->count.counter) < 0; |
101 | local_irq_restore(flags); | 99 | cris_atomic_restore(sem, flags); |
102 | if(failed) | 100 | if(failed) |
103 | failed = __down_interruptible(sem); | 101 | failed = __down_interruptible(sem); |
104 | return(failed); | 102 | return(failed); |
@@ -109,13 +107,13 @@ extern inline int down_trylock(struct semaphore * sem) | |||
109 | unsigned long flags; | 107 | unsigned long flags; |
110 | int failed; | 108 | int failed; |
111 | 109 | ||
112 | local_save_flags(flags); | 110 | cris_atomic_save(sem, flags); |
113 | local_irq_disable(); | ||
114 | failed = --(sem->count.counter) < 0; | 111 | failed = --(sem->count.counter) < 0; |
115 | local_irq_restore(flags); | 112 | cris_atomic_restore(sem, flags); |
116 | if(failed) | 113 | if(failed) |
117 | failed = __down_trylock(sem); | 114 | failed = __down_trylock(sem); |
118 | return(failed); | 115 | return(failed); |
116 | |||
119 | } | 117 | } |
120 | 118 | ||
121 | /* | 119 | /* |
@@ -130,10 +128,9 @@ extern inline void up(struct semaphore * sem) | |||
130 | int wakeup; | 128 | int wakeup; |
131 | 129 | ||
132 | /* atomically increment the semaphores count, and if it was negative, we wake people */ | 130 | /* atomically increment the semaphores count, and if it was negative, we wake people */ |
133 | local_save_flags(flags); | 131 | cris_atomic_save(sem, flags); |
134 | local_irq_disable(); | ||
135 | wakeup = ++(sem->count.counter) <= 0; | 132 | wakeup = ++(sem->count.counter) <= 0; |
136 | local_irq_restore(flags); | 133 | cris_atomic_restore(sem, flags); |
137 | if(wakeup) { | 134 | if(wakeup) { |
138 | __up(sem); | 135 | __up(sem); |
139 | } | 136 | } |