这段代码仍然处于 lock1 的临界区,如果此时硬件中断也需要申请 lock1 锁会导致死锁,这是因为 spin_unlock_irq 在解锁时一定会将本地 CPU 的中断打开,从而导致硬件中断可以重新强制抢占 CPU,所以最好的方式就是 lock2 在锁之前保存当前的中断状态,在解锁时恢复当前的中断状态,这也就是 spin_lock_irqsave
unsignedlong__lockfunc_spin_lock_irqsave(spinlock_t*lock){unsignedlongflags;local_irq_save(flags);//将状态寄存器的值写入flags保存preempt_disable();//关闭内核抢占,内核抢占锁加1spin_acquire(&lock->dep_map,0,0,_RET_IP_);#ifdef CONFIG_LOCKDEPLOCK_CONTENDED(lock,_raw_spin_trylock,_raw_spin_l...
spin_lock/spin_lock_irqsave 保护的临界区内禁止调用可能使CPU睡眠/发生调度的函数(包括但不限于ioremap/mutex/semaphore等),否则可能出现死锁引起CPU挂死等问题。 CPU挂死问题在编码压力测试下出现,经过排查和复测已明确是上述原因导致;上周前端反馈出现VB申请不到打印后,CPU立即挂死,原因也是ISP驱动内部也出现上述...
使用spin_lock_irqsave在于你不期望在离开临界区后,改变中断的开启,关闭状态!进入临界区是关闭的,离开后它同样应该是关闭的! 如果自旋锁在中断处理函数中被用到,那么在获取该锁之前需要关闭本地中断,spin_lock_irqsave 只是下列动作的一个便利接口: 1 保存本地中断状态 2 关闭本地中断 3 获取自旋锁 解锁时通过...
在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆。首先看一下代码是如何实现的。spin_lock的调用关系spin_lock |+ ---> raw_spin_lock |+---> _raw_spin_lock|+---> __raw_spin_lockstatic inline void __raw_spin_lock(raw_spinlock_t *lock) { preempt_disable...
在SMP机器上,我们必须使用spin_lock_irqsave而不是来自中断上下文的spin_lock_irq。 为什么我们要保存标志(包含IF)? 是否有另一个中断例程可以中断我们? 请您参考如下方法: 我是内核的新手,但是从我从罗伯特·洛夫(Robert Love)的书“Linux Kernel Development”(Linux内核开发)中了解到的情况来看,如果在代码开始锁...
在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆。首先看一下代码是如何实现的。 spin_lock的调用关系 spin_lock | + ---> raw_spin_lock [cpp] view plaincopy static inline void __raw_spin_lock(raw_spinlock_t *lock) { ...
以s3c2440 ARM9核为例: 一:s3c2440 ARM处理器特性: 1、S3C2440支持60个中断源,含子中断源...
在这个例子中,my_function函数首先获取自旋锁my_lock,然后修改共享变量shared_var,最后释放自旋锁。 禁止中断的原因 在获取自旋锁时,通常会禁止中断以防止中断竞争问题,这是因为在中断处理程序运行期间,如果有另一个中断请求到来并试图获取同一个锁,可能会导致死锁。spin_lock_irqsave()函数会在获取锁的同时保存当前...
linux自旋锁spin_lock spin_lock与spin_lock_irq与spin_lock_irqsave spin_lock与spin_lock_irq两者差别在于是否调用local_irq_disable()函数, 即是否禁止本地中断。 spin_lock比spin_lock_irq速度快,但是它并不是任何情况下都是安全的。在任何情况下使用spin_lock_irq都是安全的。因为它既禁止本地中断,又禁止...