中断处理程序中并不总是需要自旋锁。
请首先注意一件事 - 当中断控制器上发生特定设备的中断时,该中断在中断控制器处被禁用,因此在该特定设备的所有内核上。因此,同一设备的中断不能同时出现在所有 CPU 上。因此,在正常情况下,由于代码不会重入,因此不需要任何自旋锁。
尽管在以下两种情况下,中断处理程序中需要自旋锁。
- 请注意,当中断来自设备和 IRQ 线时,该内核会禁用该内核上的所有其他中断,也会禁用其他内核上的该设备中断。来自其他设备的中断可能来自其他核心。
因此,可能会为不同的设备注册相同的中断处理程序。例如:- request_irq(A,func,..); reqest_irq(B,func,..); 为设备调用一个中断处理函数。对于设备 B,调用相同的中断处理函数 func。因此,在这种情况下应该使用自旋锁来防止引发条件。
- 当在中断处理程序中使用相同的资源以及在进程上下文中运行的其他一些代码时。例如:- 有资源 A 所以可能存在这样一种情况,其中一个内核在中断模式下运行,中断处理程序正在修改资源 A,而其他内核在进程上下文中运行,并且也在其他地方修改相同的资源. 因此,为了呈现该资源的引发条件,我们应该使用自旋锁。