OK6410A 开发板 (八) 77 linux-5.11 OK6410A linux 内核同步机制 读写信号量的实现
2022-08-18 来源:csdn
解决了什么
实现
down_read/up_read
kernel/locking/rwsem.c
down_read
LOCK_CONTENDED(sem, __down_read_trylock, __down_read);
include/linux/lockdep.h
449 #define LOCK_CONTENDED(_lock, try, lock)
450 lock(_lock)
kernel/locking/rwsem.c
1220 static inline void __down_read(struct rw_semaphore *sem)
1221 {
1222 __down_read_common(sem, TASK_UNINTERRUPTIBLE);
1223 }
1205 /*
1206 * lock for reading
1207 */
1208 static inline int __down_read_common(struct rw_semaphore *sem, int state)
1209 {
1210 long count;
1211
1212 if (!rwsem_read_trylock(sem, &count)) {
1213 if (IS_ERR(rwsem_down_read_slowpath(sem, count, state)))
1214 return -EINTR;
1215 DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem);
1216 }
1217 return 0;
1218 }
235 static inline bool rwsem_read_trylock(struct rw_semaphore *sem, long *cntp)
236 {
237 *cntp = atomic_long_add_return_acquire(RWSEM_READER_BIAS, &sem->count);
238
239 if (WARN_ON_ONCE(*cntp < 0))
240 rwsem_set_nonspinnable(sem);
241
242 if (!(*cntp & RWSEM_READ_FAILED_MASK)) {
243 rwsem_set_reader_owned(sem);
244 return true;
245 }
246
247 return false;
248 }
include/asm-generic/atomic-long.h
556 static __always_inline long
557 atomic_long_add_return_acquire(long i, atomic_long_t *v)
558 {
559 return atomic_add_return_acquire(i, v);
560 }
down_write/up_write
down_write
LOCK_CONTENDED(sem, __down_write_trylock, __down_write);
__down_write
__down_write_common
rwsem_write_trylock
atomic_long_try_cmpxchg_acquire
- 〖Linux〗OK6410a蜂鸣器的驱动程序编写全程实录
- 开发环境搭建 (一) OK6410A 开发环境 1官方环境 OK
- 开发环境搭建 (一) OK6410A 开发环境 2 更改环境 OK
- 开发环境搭建 (一) OK6410A 开发环境 3 更改环境 FAIL
- 开发环境搭建 (二) OK6410A 开发环境 其他
- 开发环境搭建 (一) OK6410A 开发环境 4 更改环境 OK
- OK6410A 开发板 (二) 环境熟悉
- OK6410A 开发板 (三) u-boot-1.1.6 boot 解析
- OK6410A 开发板 (四) OK6410A 裸机代码
- OK6410A 开发板 (五) u-boot-2021.01 移植 到 ok6410a