]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | From: Petr Tesarik <ptesarik@suse.cz> |
2 | Subject: Allow rwlocks to re-enable interrupts | |
3 | References: bnc#387784 | |
4 | Mainline: no | |
5 | ||
6 | Pass the original flags to rwlock arch-code, so that it can re-enable | |
7 | interrupts if desired. | |
8 | ||
9 | Signed-off-by: Petr Tesarik <ptesarik@suse.cz> | |
10 | ||
11 | --- | |
12 | arch/alpha/include/asm/spinlock.h | 3 +++ | |
13 | arch/arm/include/asm/spinlock.h | 3 +++ | |
14 | arch/ia64/include/asm/spinlock.h | 3 +++ | |
15 | arch/powerpc/include/asm/spinlock.h | 3 +++ | |
16 | arch/s390/include/asm/spinlock.h | 3 +++ | |
17 | arch/sh/include/asm/spinlock.h | 3 +++ | |
18 | arch/sparc/include/asm/spinlock_32.h | 2 ++ | |
19 | arch/sparc/include/asm/spinlock_64.h | 2 ++ | |
20 | include/asm-cris/arch-v32/spinlock.h | 2 ++ | |
21 | include/asm-m32r/spinlock.h | 3 +++ | |
22 | include/asm-mips/spinlock.h | 2 ++ | |
23 | include/asm-parisc/spinlock.h | 3 +++ | |
24 | include/asm-x86/spinlock.h | 3 +++ | |
25 | include/linux/spinlock.h | 6 ++++++ | |
26 | kernel/spinlock.c | 8 ++++++++ | |
27 | 15 files changed, 49 insertions(+) | |
28 | ||
29 | --- linux-2.6.26.orig/arch/alpha/include/asm/spinlock.h 2008-09-26 12:13:24.000000000 +0200 | |
30 | +++ linux-2.6.26/arch/alpha/include/asm/spinlock.h 2008-09-26 13:01:43.000000000 +0200 | |
31 | @@ -166,6 +166,9 @@ static inline void __raw_write_unlock(ra | |
32 | lock->lock = 0; | |
33 | } | |
34 | ||
35 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
36 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
37 | + | |
38 | #define _raw_spin_relax(lock) cpu_relax() | |
39 | #define _raw_read_relax(lock) cpu_relax() | |
40 | #define _raw_write_relax(lock) cpu_relax() | |
41 | --- linux-2.6.26.orig/arch/arm/include/asm/spinlock.h 2008-09-26 10:21:46.000000000 +0200 | |
42 | +++ linux-2.6.26/arch/arm/include/asm/spinlock.h 2008-09-26 13:01:25.000000000 +0200 | |
43 | @@ -217,6 +217,9 @@ static inline int __raw_read_trylock(raw | |
44 | /* read_can_lock - would read_trylock() succeed? */ | |
45 | #define __raw_read_can_lock(x) ((x)->lock < 0x80000000) | |
46 | ||
47 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
48 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
49 | + | |
50 | #define _raw_spin_relax(lock) cpu_relax() | |
51 | #define _raw_read_relax(lock) cpu_relax() | |
52 | #define _raw_write_relax(lock) cpu_relax() | |
53 | --- linux-2.6.26.orig/arch/ia64/include/asm/spinlock.h 2008-09-26 10:21:47.000000000 +0200 | |
54 | +++ linux-2.6.26/arch/ia64/include/asm/spinlock.h 2008-09-26 13:02:50.000000000 +0200 | |
55 | @@ -213,6 +213,9 @@ static inline int __raw_read_trylock(raw | |
56 | return (u32)ia64_cmpxchg4_acq((__u32 *)(x), new.word, old.word) == old.word; | |
57 | } | |
58 | ||
59 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
60 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
61 | + | |
62 | #define _raw_spin_relax(lock) cpu_relax() | |
63 | #define _raw_read_relax(lock) cpu_relax() | |
64 | #define _raw_write_relax(lock) cpu_relax() | |
65 | --- linux-2.6.26.orig/arch/powerpc/include/asm/spinlock.h 2008-09-26 10:21:48.000000000 +0200 | |
66 | +++ linux-2.6.26/arch/powerpc/include/asm/spinlock.h 2008-09-26 13:00:32.000000000 +0200 | |
67 | @@ -287,6 +287,9 @@ static inline void __raw_write_unlock(ra | |
68 | rw->lock = 0; | |
69 | } | |
70 | ||
71 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
72 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
73 | + | |
74 | #define _raw_spin_relax(lock) __spin_yield(lock) | |
75 | #define _raw_read_relax(lock) __rw_yield(lock) | |
76 | #define _raw_write_relax(lock) __rw_yield(lock) | |
77 | --- linux-2.6.26.orig/arch/s390/include/asm/spinlock.h 2008-09-26 10:21:49.000000000 +0200 | |
78 | +++ linux-2.6.26/arch/s390/include/asm/spinlock.h 2008-09-26 13:00:02.000000000 +0200 | |
79 | @@ -172,6 +172,9 @@ static inline int __raw_write_trylock(ra | |
80 | return _raw_write_trylock_retry(rw); | |
81 | } | |
82 | ||
83 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
84 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
85 | + | |
86 | #define _raw_read_relax(lock) cpu_relax() | |
87 | #define _raw_write_relax(lock) cpu_relax() | |
88 | ||
89 | --- linux-2.6.26.orig/arch/sh/include/asm/spinlock.h 2008-09-26 10:21:49.000000000 +0200 | |
90 | +++ linux-2.6.26/arch/sh/include/asm/spinlock.h 2008-09-26 12:59:32.000000000 +0200 | |
91 | @@ -216,6 +216,9 @@ static inline int __raw_write_trylock(ra | |
92 | return (oldval > (RW_LOCK_BIAS - 1)); | |
93 | } | |
94 | ||
95 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
96 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
97 | + | |
98 | #define _raw_spin_relax(lock) cpu_relax() | |
99 | #define _raw_read_relax(lock) cpu_relax() | |
100 | #define _raw_write_relax(lock) cpu_relax() | |
101 | --- linux-2.6.26.orig/arch/sparc/include/asm/spinlock_32.h 2008-09-26 10:21:49.000000000 +0200 | |
102 | +++ linux-2.6.26/arch/sparc/include/asm/spinlock_32.h 2008-09-26 12:51:28.000000000 +0200 | |
103 | @@ -179,6 +179,8 @@ static inline int __read_trylock(raw_rwl | |
104 | #define __raw_write_unlock(rw) do { (rw)->lock = 0; } while(0) | |
105 | ||
106 | #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) | |
107 | +#define __raw_read_lock_flags(rw, flags) __raw_read_lock(rw) | |
108 | +#define __raw_write_lock_flags(rw, flags) __raw_write_lock(rw) | |
109 | ||
110 | #define _raw_spin_relax(lock) cpu_relax() | |
111 | #define _raw_read_relax(lock) cpu_relax() | |
112 | --- linux-2.6.26.orig/arch/sparc/include/asm/spinlock_64.h 2008-09-26 10:21:49.000000000 +0200 | |
113 | +++ linux-2.6.26/arch/sparc/include/asm/spinlock_64.h 2008-09-26 12:52:31.000000000 +0200 | |
114 | @@ -232,9 +232,11 @@ static int inline __write_trylock(raw_rw | |
115 | } | |
116 | ||
117 | #define __raw_read_lock(p) __read_lock(p) | |
118 | +#define __raw_read_lock_flags(p, f) __read_lock(p) | |
119 | #define __raw_read_trylock(p) __read_trylock(p) | |
120 | #define __raw_read_unlock(p) __read_unlock(p) | |
121 | #define __raw_write_lock(p) __write_lock(p) | |
122 | +#define __raw_write_lock_flags(p, f) __write_lock(p) | |
123 | #define __raw_write_unlock(p) __write_unlock(p) | |
124 | #define __raw_write_trylock(p) __write_trylock(p) | |
125 | ||
126 | --- linux-2.6.26.orig/include/asm-cris/arch-v32/spinlock.h 2008-07-13 23:51:29.000000000 +0200 | |
127 | +++ linux-2.6.26/include/asm-cris/arch-v32/spinlock.h 2008-09-26 12:54:11.000000000 +0200 | |
128 | @@ -121,6 +121,8 @@ static inline int __raw_write_trylock(r | |
129 | return 1; | |
130 | } | |
131 | ||
132 | +#define _raw_read_lock_flags(lock, flags) _raw_read_lock(lock) | |
133 | +#define _raw_write_lock_flags(lock, flags) _raw_write_lock(lock) | |
134 | ||
135 | #define _raw_spin_relax(lock) cpu_relax() | |
136 | #define _raw_read_relax(lock) cpu_relax() | |
137 | --- linux-2.6.26.orig/include/asm-m32r/spinlock.h 2008-07-13 23:51:29.000000000 +0200 | |
138 | +++ linux-2.6.26/include/asm-m32r/spinlock.h 2008-09-26 12:55:46.000000000 +0200 | |
139 | @@ -316,6 +316,9 @@ static inline int __raw_write_trylock(ra | |
140 | return 0; | |
141 | } | |
142 | ||
143 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
144 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
145 | + | |
146 | #define _raw_spin_relax(lock) cpu_relax() | |
147 | #define _raw_read_relax(lock) cpu_relax() | |
148 | #define _raw_write_relax(lock) cpu_relax() | |
149 | --- linux-2.6.26.orig/include/asm-mips/spinlock.h 2008-07-13 23:51:29.000000000 +0200 | |
150 | +++ linux-2.6.26/include/asm-mips/spinlock.h 2008-09-26 12:56:28.000000000 +0200 | |
151 | @@ -368,6 +368,8 @@ static inline int __raw_write_trylock(ra | |
152 | return ret; | |
153 | } | |
154 | ||
155 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
156 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
157 | ||
158 | #define _raw_spin_relax(lock) cpu_relax() | |
159 | #define _raw_read_relax(lock) cpu_relax() | |
160 | --- linux-2.6.26.orig/include/asm-parisc/spinlock.h 2008-07-13 23:51:29.000000000 +0200 | |
161 | +++ linux-2.6.26/include/asm-parisc/spinlock.h 2008-09-26 12:57:22.000000000 +0200 | |
162 | @@ -187,6 +187,9 @@ static __inline__ int __raw_write_can_lo | |
163 | return !rw->counter; | |
164 | } | |
165 | ||
166 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
167 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
168 | + | |
169 | #define _raw_spin_relax(lock) cpu_relax() | |
170 | #define _raw_read_relax(lock) cpu_relax() | |
171 | #define _raw_write_relax(lock) cpu_relax() | |
172 | --- linux-2.6.26.orig/include/asm-x86/spinlock.h 2008-09-26 10:22:12.000000000 +0200 | |
173 | +++ linux-2.6.26/include/asm-x86/spinlock.h 2008-09-26 12:58:07.000000000 +0200 | |
174 | @@ -362,6 +362,9 @@ static inline void __raw_write_unlock(ra | |
175 | : "+m" (rw->lock) : "i" (RW_LOCK_BIAS) : "memory"); | |
176 | } | |
177 | ||
178 | +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) | |
179 | +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) | |
180 | + | |
181 | #define _raw_spin_relax(lock) cpu_relax() | |
182 | #define _raw_read_relax(lock) cpu_relax() | |
183 | #define _raw_write_relax(lock) cpu_relax() | |
184 | --- linux-2.6.26.orig/include/linux/spinlock.h 2008-09-26 10:22:12.000000000 +0200 | |
185 | +++ linux-2.6.26/include/linux/spinlock.h 2008-09-26 13:04:17.000000000 +0200 | |
186 | @@ -148,9 +148,11 @@ do { \ | |
187 | extern int _raw_spin_trylock(spinlock_t *lock); | |
188 | extern void _raw_spin_unlock(spinlock_t *lock); | |
189 | extern void _raw_read_lock(rwlock_t *lock); | |
190 | +#define _raw_read_lock_flags(lock, flags) _raw_read_lock(lock) | |
191 | extern int _raw_read_trylock(rwlock_t *lock); | |
192 | extern void _raw_read_unlock(rwlock_t *lock); | |
193 | extern void _raw_write_lock(rwlock_t *lock); | |
194 | +#define _raw_write_lock_flags(lock, flags) _raw_write_lock(lock) | |
195 | extern int _raw_write_trylock(rwlock_t *lock); | |
196 | extern void _raw_write_unlock(rwlock_t *lock); | |
197 | #else | |
198 | @@ -160,9 +162,13 @@ do { \ | |
199 | # define _raw_spin_trylock(lock) __raw_spin_trylock(&(lock)->raw_lock) | |
200 | # define _raw_spin_unlock(lock) __raw_spin_unlock(&(lock)->raw_lock) | |
201 | # define _raw_read_lock(rwlock) __raw_read_lock(&(rwlock)->raw_lock) | |
202 | +# define _raw_read_lock_flags(lock, flags) \ | |
203 | + __raw_read_lock_flags(&(lock)->raw_lock, *(flags)) | |
204 | # define _raw_read_trylock(rwlock) __raw_read_trylock(&(rwlock)->raw_lock) | |
205 | # define _raw_read_unlock(rwlock) __raw_read_unlock(&(rwlock)->raw_lock) | |
206 | # define _raw_write_lock(rwlock) __raw_write_lock(&(rwlock)->raw_lock) | |
207 | +# define _raw_write_lock_flags(lock, flags) \ | |
208 | + __raw_write_lock_flags(&(lock)->raw_lock, *(flags)) | |
209 | # define _raw_write_trylock(rwlock) __raw_write_trylock(&(rwlock)->raw_lock) | |
210 | # define _raw_write_unlock(rwlock) __raw_write_unlock(&(rwlock)->raw_lock) | |
211 | #endif | |
212 | --- linux-2.6.26.orig/kernel/spinlock.c 2008-09-26 10:22:13.000000000 +0200 | |
213 | +++ linux-2.6.26/kernel/spinlock.c 2008-09-26 13:10:35.000000000 +0200 | |
214 | @@ -121,7 +121,11 @@ unsigned long __lockfunc _read_lock_irqs | |
215 | local_irq_save(flags); | |
216 | preempt_disable(); | |
217 | rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); | |
218 | +#ifdef CONFIG_LOCKDEP | |
219 | LOCK_CONTENDED(lock, _raw_read_trylock, _raw_read_lock); | |
220 | +#else | |
221 | + _raw_read_lock_flags(lock, &flags); | |
222 | +#endif | |
223 | return flags; | |
224 | } | |
225 | EXPORT_SYMBOL(_read_lock_irqsave); | |
226 | @@ -151,7 +155,11 @@ unsigned long __lockfunc _write_lock_irq | |
227 | local_irq_save(flags); | |
228 | preempt_disable(); | |
229 | rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); | |
230 | +#ifdef CONFIG_LOCKDEP | |
231 | LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock); | |
232 | +#else | |
233 | + _raw_write_lock_flags(lock, &flags); | |
234 | +#endif | |
235 | return flags; | |
236 | } | |
237 | EXPORT_SYMBOL(_write_lock_irqsave); |