• 首页
  • 中国
  • OK6410A 开发板 (八) 77 linux-5.11 OK6410A linux 内核同步机制 读写信号量的实现

OK6410A 开发板 (八) 77 linux-5.11 OK6410A linux 内核同步机制 读写信号量的实现

2023-11-01 166浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

解决了什么

实现

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

百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台