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