- 解决了什么问题
实现
read_lock
read_unlock
include/linux/rwlock.h
71 #define read_lock(lock) _raw_read_lock(lock)
include/linux/rwlock_api_smp.h
44 #define _raw_read_lock(lock) __raw_read_lock(lock)
include/linux/rwlock_api_smp.h
146 static inline void __raw_read_lock(rwlock_t *lock)
147 {
148 preempt_disable();
149 rwlock_acquire_read(&lock->dep_map, 0, 0, _RET_IP_);
150 LOCK_CONTENDED(lock, do_raw_read_trylock, do_raw_read_lock);
151 }
include/linux/rwlock.h
50 # define do_raw_read_lock(rwlock) do {__acquire(lock); arch_read_lock(&(rwlock)->raw_lock); } while (0)
arch/arm/include/asm/spinlock.h
207 static inline void arch_read_lock(arch_rwlock_t *rw)
208 {
209 unsigned long tmp, tmp2;
210
211 prefetchw(&rw->lock);
212 __asm__ __volatile__(
213 " .syntax unified\n"
214 "1: ldrex %0, [%2]\n"
215 " adds %0, %0, #1\n"
216 " strexpl %1, %0, [%2]\n"
217 WFE("mi")
218 " rsbspl %0, %1, #0\n"
219 " bmi 1b"
220 : "=&r" (tmp), "=&r" (tmp2)
221 : "r" (&rw->lock)
222 : "cc");
223
224 smp_mb();
225 }
write_lock
write_unlock
include/linux/rwlock.h
70 #define write_lock(lock) _raw_write_lock(lock)
include/linux/rwlock_api_smp.h
48 #define _raw_write_lock(lock) __raw_write_lock(lock)
207 static inline void __raw_write_lock(rwlock_t *lock)
208 {
209 preempt_disable();
210 rwlock_acquire(&lock->dep_map, 0, 0, _RET_IP_);
211 LOCK_CONTENDED(lock, do_raw_write_trylock, do_raw_write_lock);
212 }
include/linux/lockdep.h
452 #define LOCK_CONTENDED_RETURN(_lock, try, lock) \
453 lock(_lock)
include/linux/rwlock.h
55 # define do_raw_write_lock(rwlock) do {__acquire(lock); arch_write_lock(&(rwlock)->raw_lock); } while (0)
arch/arm/include/asm/spinlock.h
139 static inline void arch_write_lock(arch_rwlock_t *rw)
140 {
141 unsigned long tmp;
142
143 prefetchw(&rw->lock);
144 __asm__ __volatile__(
145 "1: ldrex %0, [%1]\n"
146 " teq %0, #0\n"
147 WFE("ne")
148 " strexeq %0, %2, [%1]\n"
149 " teq %0, #0\n"
150 " bne 1b"
151 : "=&r" (tmp)
152 : "r" (&rw->lock), "r" (0x80000000)
153 : "cc");
154
155 smp_mb();
156 }