1 From: Petr Tesarik <ptesarik@suse.cz>
2 Subject: Allow rwlocks to re-enable interrupts
6 Pass the original flags to rwlock arch-code, so that it can re-enable
9 Signed-off-by: Petr Tesarik <ptesarik@suse.cz>
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(+)
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
35 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
36 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
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)
47 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
48 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
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;
59 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
60 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
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
71 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
72 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
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);
83 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
84 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
86 #define _raw_read_relax(lock) cpu_relax()
87 #define _raw_write_relax(lock) cpu_relax()
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));
95 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
96 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
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)
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)
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
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)
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
132 +#define _raw_read_lock_flags(lock, flags) _raw_read_lock(lock)
133 +#define _raw_write_lock_flags(lock, flags) _raw_write_lock(lock)
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
143 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
144 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
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
155 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
156 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
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
166 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
167 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
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");
178 +#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
179 +#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
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);
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)
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);
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);
221 + _raw_read_lock_flags(lock, &flags);
225 EXPORT_SYMBOL(_read_lock_irqsave);
226 @@ -151,7 +155,11 @@ unsigned long __lockfunc _write_lock_irq
227 local_irq_save(flags);
229 rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_);
230 +#ifdef CONFIG_LOCKDEP
231 LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock);
233 + _raw_write_lock_flags(lock, &flags);
237 EXPORT_SYMBOL(_write_lock_irqsave);