2 * Copyright (2004) Linus Torvalds
4 * Author: Zwane Mwaikambo <zwane@fsmlabs.com>
6 * Copyright (2004, 2005) Ingo Molnar
8 * This file contains the spinlock/rwlock implementations for the
9 * SMP and the DEBUG_SPINLOCK cases.
12 #include <lwk/linkage.h>
13 #include <lwk/spinlock.h>
14 //#include <lwk/interrupt.h>
15 #include <lwk/linux_compat.h>
18 * Generic declaration of the raw read_trylock() function,
19 * architectures are supposed to optimize this:
21 int __lockfunc generic__raw_read_trylock(raw_rwlock_t *lock)
23 __raw_read_lock(lock);
26 EXPORT_SYMBOL(generic__raw_read_trylock);
28 int __lockfunc _spin_trylock(spinlock_t *lock)
30 if (_raw_spin_trylock(lock))
34 EXPORT_SYMBOL(_spin_trylock);
36 int __lockfunc _read_trylock(rwlock_t *lock)
38 if (_raw_read_trylock(lock))
42 EXPORT_SYMBOL(_read_trylock);
44 int __lockfunc _write_trylock(rwlock_t *lock)
46 if (_raw_write_trylock(lock))
50 EXPORT_SYMBOL(_write_trylock);
52 void __lockfunc _read_lock(rwlock_t *lock)
56 EXPORT_SYMBOL(_read_lock);
58 unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
62 local_irq_save(flags);
63 _raw_spin_lock_flags(lock, &flags);
66 EXPORT_SYMBOL(_spin_lock_irqsave);
68 void __lockfunc _spin_lock_irq(spinlock_t *lock)
73 EXPORT_SYMBOL(_spin_lock_irq);
76 void __lockfunc _spin_lock_bh(spinlock_t *lock)
81 EXPORT_SYMBOL(_spin_lock_bh);
84 unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock)
88 local_irq_save(flags);
92 EXPORT_SYMBOL(_read_lock_irqsave);
94 void __lockfunc _read_lock_irq(rwlock_t *lock)
99 EXPORT_SYMBOL(_read_lock_irq);
102 void __lockfunc _read_lock_bh(rwlock_t *lock)
105 _raw_read_lock(lock);
107 EXPORT_SYMBOL(_read_lock_bh);
110 unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock)
114 local_irq_save(flags);
115 _raw_write_lock(lock);
118 EXPORT_SYMBOL(_write_lock_irqsave);
120 void __lockfunc _write_lock_irq(rwlock_t *lock)
123 _raw_write_lock(lock);
125 EXPORT_SYMBOL(_write_lock_irq);
128 void __lockfunc _write_lock_bh(rwlock_t *lock)
131 _raw_write_lock(lock);
133 EXPORT_SYMBOL(_write_lock_bh);
136 void __lockfunc _spin_lock(spinlock_t *lock)
138 _raw_spin_lock(lock);
141 EXPORT_SYMBOL(_spin_lock);
143 void __lockfunc _write_lock(rwlock_t *lock)
145 _raw_write_lock(lock);
148 EXPORT_SYMBOL(_write_lock);
150 void __lockfunc _spin_unlock(spinlock_t *lock)
152 _raw_spin_unlock(lock);
154 EXPORT_SYMBOL(_spin_unlock);
156 void __lockfunc _write_unlock(rwlock_t *lock)
158 _raw_write_unlock(lock);
160 EXPORT_SYMBOL(_write_unlock);
162 void __lockfunc _read_unlock(rwlock_t *lock)
164 _raw_read_unlock(lock);
166 EXPORT_SYMBOL(_read_unlock);
168 void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
170 _raw_spin_unlock(lock);
171 local_irq_restore(flags);
173 EXPORT_SYMBOL(_spin_unlock_irqrestore);
175 void __lockfunc _spin_unlock_irq(spinlock_t *lock)
177 _raw_spin_unlock(lock);
180 EXPORT_SYMBOL(_spin_unlock_irq);
183 void __lockfunc _spin_unlock_bh(spinlock_t *lock)
185 _raw_spin_unlock(lock);
188 EXPORT_SYMBOL(_spin_unlock_bh);
191 void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
193 _raw_read_unlock(lock);
194 local_irq_restore(flags);
196 EXPORT_SYMBOL(_read_unlock_irqrestore);
198 void __lockfunc _read_unlock_irq(rwlock_t *lock)
200 _raw_read_unlock(lock);
203 EXPORT_SYMBOL(_read_unlock_irq);
206 void __lockfunc _read_unlock_bh(rwlock_t *lock)
208 _raw_read_unlock(lock);
211 EXPORT_SYMBOL(_read_unlock_bh);
214 void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
216 _raw_write_unlock(lock);
217 local_irq_restore(flags);
219 EXPORT_SYMBOL(_write_unlock_irqrestore);
221 void __lockfunc _write_unlock_irq(rwlock_t *lock)
223 _raw_write_unlock(lock);
226 EXPORT_SYMBOL(_write_unlock_irq);
229 void __lockfunc _write_unlock_bh(rwlock_t *lock)
231 _raw_write_unlock(lock);
234 EXPORT_SYMBOL(_write_unlock_bh);
238 int __lockfunc _spin_trylock_bh(spinlock_t *lock)
241 if (_raw_spin_trylock(lock))
246 EXPORT_SYMBOL(_spin_trylock_bh);
249 int in_lock_functions(unsigned long addr)
251 /* Linker adds these: start and end of __lockfunc functions */
252 extern char __lock_text_start[], __lock_text_end[];
254 return addr >= (unsigned long)__lock_text_start
255 && addr < (unsigned long)__lock_text_end;
257 EXPORT_SYMBOL(in_lock_functions);