OK6410A 开发板 (八) 75 linux-5.11 OK6410A linux 内核同步机制 读写锁的实现

本文详细解析了Linux内核中读写锁(read_lock/write_lock)的实现机制,包括read_lock()和write_lock()的底层操作,涉及了预读取、内存屏障和原子指令等关键步骤,展示了其在多处理器环境下的同步策略。
摘要由CSDN通过智能技术生成
  • 解决了什么问题

实现
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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值