Linux kernel 从中断处理程序中重新启用IRQ行的副作用

Linux kernel 从中断处理程序中重新启用IRQ行的副作用,linux-kernel,kernel,Linux Kernel,Kernel,如果在硬中断上下文中通过spin_unlock_IRQ错误地重新启用IRQ行,会出现什么样的副作用?换句话说,为什么这里不推荐自旋锁定irq()/自旋解锁irq()对?因为,如果中断关闭,然后您获得自旋锁定irq,然后自旋解锁irq。此spin\u unlock\u irq将再次启用中断。但您已经从系统的状态开始,在该状态下中断是关闭的,现在它们是打开的。这是不可取的 因此,您使用spin\u lock\u irqsave所做的是*保存/保留*IRQ的状态(打开或关闭),当您执行spin\u l

如果在硬中断上下文中通过spin_unlock_IRQ错误地重新启用IRQ行,会出现什么样的副作用?换句话说,为什么这里不推荐自旋锁定irq()/自旋解锁irq()对?

因为,如果中断关闭,然后您获得
自旋锁定irq
,然后
自旋解锁irq
。此
spin\u unlock\u irq
将再次启用中断。但您已经从系统的状态开始,在该状态下中断是关闭的,现在它们是打开的。这是不可取的

因此,您使用
spin\u lock\u irqsave
所做的是*保存/保留*IRQ的状态(打开或关闭),当您执行
spin\u lock\u irqrestore
时,您将返回到获取锁之前设置的IRQ状态

发件人:

通过调用spin_unlock_irqrestore(),中断将恢复为 获取锁时的状态

风险: 当中断应该被禁用,并且您启用了它,并且有一个正在运行的IRQ处理程序(IRQ被禁用)可能会导致中断嵌套,嵌套太多可能会使您的系统崩溃(例如一秒钟内中断数千次的网络IRQ)


来自内核源:

326 static inline void spin_lock_irq(spinlock_t *lock)
327 {
328         raw_spin_lock_irq(&lock->rlock);
329 }

331 #define spin_lock_irqsave(lock, flags)                          \
332 do {                                                            \
333         raw_spin_lock_irqsave(spinlock_check(lock), flags);     \
334 } while (0)
这里首先检查
IRQ
的状态并保存它

290 static inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
291 {
292         return &lock->rlock;
293 }

您可以在
spin\u unlock\u irq
spin\u unlock\u irqrestore

中找到类似的来源,请阅读:它并没有真正回答我的问题:重新启用irq线的风险是什么?会发生什么?我补充了一个答案,希望能有所帮助。