Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Allow rwlocks to re-enable interrupts

Pass the original flags to rwlock arch-code, so that it can re-enable
interrupts if implemented for that architecture.

Initially, make __raw_read_lock_flags and __raw_write_lock_flags stubs
which just do the same thing as non-flags variants.

Signed-off-by: Petr Tesarik <ptesarik@suse.cz>
Signed-off-by: Robin Holt <holt@sgi.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: <linux-arch@vger.kernel.org>
Acked-by: Ingo Molnar <mingo@elte.hu>
Cc: "Luck, Tony" <tony.luck@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Robin Holt and committed by
Linus Torvalds
f5f7eac4 e8c158bb

+45 -2
+3
arch/alpha/include/asm/spinlock.h
··· 166 166 lock->lock = 0; 167 167 } 168 168 169 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 170 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 171 + 169 172 #define _raw_spin_relax(lock) cpu_relax() 170 173 #define _raw_read_relax(lock) cpu_relax() 171 174 #define _raw_write_relax(lock) cpu_relax()
+3
arch/arm/include/asm/spinlock.h
··· 217 217 /* read_can_lock - would read_trylock() succeed? */ 218 218 #define __raw_read_can_lock(x) ((x)->lock < 0x80000000) 219 219 220 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 221 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 222 + 220 223 #define _raw_spin_relax(lock) cpu_relax() 221 224 #define _raw_read_relax(lock) cpu_relax() 222 225 #define _raw_write_relax(lock) cpu_relax()
+2
arch/cris/include/arch-v32/arch/spinlock.h
··· 121 121 return 1; 122 122 } 123 123 124 + #define _raw_read_lock_flags(lock, flags) _raw_read_lock(lock) 125 + #define _raw_write_lock_flags(lock, flags) _raw_write_lock(lock) 124 126 125 127 #define _raw_spin_relax(lock) cpu_relax() 126 128 #define _raw_read_relax(lock) cpu_relax()
+3
arch/ia64/include/asm/spinlock.h
··· 213 213 return (u32)ia64_cmpxchg4_acq((__u32 *)(x), new.word, old.word) == old.word; 214 214 } 215 215 216 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 217 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 218 + 216 219 #define _raw_spin_relax(lock) cpu_relax() 217 220 #define _raw_read_relax(lock) cpu_relax() 218 221 #define _raw_write_relax(lock) cpu_relax()
+2
arch/mips/include/asm/spinlock.h
··· 480 480 return ret; 481 481 } 482 482 483 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 484 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 483 485 484 486 #define _raw_spin_relax(lock) cpu_relax() 485 487 #define _raw_read_relax(lock) cpu_relax()
+3
arch/parisc/include/asm/spinlock.h
··· 187 187 return !rw->counter; 188 188 } 189 189 190 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 191 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 192 + 190 193 #define _raw_spin_relax(lock) cpu_relax() 191 194 #define _raw_read_relax(lock) cpu_relax() 192 195 #define _raw_write_relax(lock) cpu_relax()
+3
arch/powerpc/include/asm/spinlock.h
··· 287 287 rw->lock = 0; 288 288 } 289 289 290 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 291 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 292 + 290 293 #define _raw_spin_relax(lock) __spin_yield(lock) 291 294 #define _raw_read_relax(lock) __rw_yield(lock) 292 295 #define _raw_write_relax(lock) __rw_yield(lock)
+3
arch/s390/include/asm/spinlock.h
··· 172 172 return _raw_write_trylock_retry(rw); 173 173 } 174 174 175 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 176 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 177 + 175 178 #define _raw_read_relax(lock) cpu_relax() 176 179 #define _raw_write_relax(lock) cpu_relax() 177 180
+3
arch/sh/include/asm/spinlock.h
··· 216 216 return (oldval > (RW_LOCK_BIAS - 1)); 217 217 } 218 218 219 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 220 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 221 + 219 222 #define _raw_spin_relax(lock) cpu_relax() 220 223 #define _raw_read_relax(lock) cpu_relax() 221 224 #define _raw_write_relax(lock) cpu_relax()
+2
arch/sparc/include/asm/spinlock_32.h
··· 177 177 #define __raw_write_unlock(rw) do { (rw)->lock = 0; } while(0) 178 178 179 179 #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) 180 + #define __raw_read_lock_flags(rw, flags) __raw_read_lock(rw) 181 + #define __raw_write_lock_flags(rw, flags) __raw_write_lock(rw) 180 182 181 183 #define _raw_spin_relax(lock) cpu_relax() 182 184 #define _raw_read_relax(lock) cpu_relax()
+2
arch/sparc/include/asm/spinlock_64.h
··· 211 211 } 212 212 213 213 #define __raw_read_lock(p) __read_lock(p) 214 + #define __raw_read_lock_flags(p, f) __read_lock(p) 214 215 #define __raw_read_trylock(p) __read_trylock(p) 215 216 #define __raw_read_unlock(p) __read_unlock(p) 216 217 #define __raw_write_lock(p) __write_lock(p) 218 + #define __raw_write_lock_flags(p, f) __write_lock(p) 217 219 #define __raw_write_unlock(p) __write_unlock(p) 218 220 #define __raw_write_trylock(p) __write_trylock(p) 219 221
+3
arch/x86/include/asm/spinlock.h
··· 295 295 : "+m" (rw->lock) : "i" (RW_LOCK_BIAS) : "memory"); 296 296 } 297 297 298 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 299 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 300 + 298 301 #define _raw_spin_relax(lock) cpu_relax() 299 302 #define _raw_read_relax(lock) cpu_relax() 300 303 #define _raw_write_relax(lock) cpu_relax()
+3
include/asm-m32r/spinlock.h
··· 316 316 return 0; 317 317 } 318 318 319 + #define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock) 320 + #define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock) 321 + 319 322 #define _raw_spin_relax(lock) cpu_relax() 320 323 #define _raw_read_relax(lock) cpu_relax() 321 324 #define _raw_write_relax(lock) cpu_relax()
+6
include/linux/spinlock.h
··· 153 153 extern int _raw_spin_trylock(spinlock_t *lock); 154 154 extern void _raw_spin_unlock(spinlock_t *lock); 155 155 extern void _raw_read_lock(rwlock_t *lock); 156 + #define _raw_read_lock_flags(lock, flags) _raw_read_lock(lock) 156 157 extern int _raw_read_trylock(rwlock_t *lock); 157 158 extern void _raw_read_unlock(rwlock_t *lock); 158 159 extern void _raw_write_lock(rwlock_t *lock); 160 + #define _raw_write_lock_flags(lock, flags) _raw_write_lock(lock) 159 161 extern int _raw_write_trylock(rwlock_t *lock); 160 162 extern void _raw_write_unlock(rwlock_t *lock); 161 163 #else ··· 167 165 # define _raw_spin_trylock(lock) __raw_spin_trylock(&(lock)->raw_lock) 168 166 # define _raw_spin_unlock(lock) __raw_spin_unlock(&(lock)->raw_lock) 169 167 # define _raw_read_lock(rwlock) __raw_read_lock(&(rwlock)->raw_lock) 168 + # define _raw_read_lock_flags(lock, flags) \ 169 + __raw_read_lock_flags(&(lock)->raw_lock, *(flags)) 170 170 # define _raw_read_trylock(rwlock) __raw_read_trylock(&(rwlock)->raw_lock) 171 171 # define _raw_read_unlock(rwlock) __raw_read_unlock(&(rwlock)->raw_lock) 172 172 # define _raw_write_lock(rwlock) __raw_write_lock(&(rwlock)->raw_lock) 173 + # define _raw_write_lock_flags(lock, flags) \ 174 + __raw_write_lock_flags(&(lock)->raw_lock, *(flags)) 173 175 # define _raw_write_trylock(rwlock) __raw_write_trylock(&(rwlock)->raw_lock) 174 176 # define _raw_write_unlock(rwlock) __raw_write_unlock(&(rwlock)->raw_lock) 175 177 #endif
+4 -2
kernel/spinlock.c
··· 121 121 local_irq_save(flags); 122 122 preempt_disable(); 123 123 rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_); 124 - LOCK_CONTENDED(lock, _raw_read_trylock, _raw_read_lock); 124 + LOCK_CONTENDED_FLAGS(lock, _raw_read_trylock, _raw_read_lock, 125 + _raw_read_lock_flags, &flags); 125 126 return flags; 126 127 } 127 128 EXPORT_SYMBOL(_read_lock_irqsave); ··· 152 151 local_irq_save(flags); 153 152 preempt_disable(); 154 153 rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_); 155 - LOCK_CONTENDED(lock, _raw_write_trylock, _raw_write_lock); 154 + LOCK_CONTENDED_FLAGS(lock, _raw_write_trylock, _raw_write_lock, 155 + _raw_write_lock_flags, &flags); 156 156 return flags; 157 157 } 158 158 EXPORT_SYMBOL(_write_lock_irqsave);