解决Spinlock问题

时间:2012-05-30 12:27:14

标签: linux-device-driver spinlock

在Linux设备驱动程序中。当它引入自旋锁时,它给出了以下示例:

  

您的驱动程序正在执行,并刚刚取出一个控制锁   访问其设备。锁定时,设备会发出锁定   中断,导致中断处理程序运行。中断   处理程序,在访问设备之前,还必须获得锁。   在中断处理程序中取出一个自旋锁是合法的   做;这是自旋锁操作不睡觉的原因之一。   但是如果中断例程在同一个程序中执行会发生什么   处理器作为最初取出锁的代码?虽然   中断处理程序正在旋转,非中断代码将无法执行   运行以释放锁定。那个处理器将永远旋转。

如何解决这个问题?使用信号量?请帮忙。

1 个答案:

答案 0 :(得分:3)

您使用非中断代码中的 spin_lock_irqsave 来禁用当前核心上的硬件中断,或使用“替代锁定”中描述的任何工具部分在同一章节中。

编辑0:

不记得那里的确切细节,但理论是:

  • 在UP系统上,您根本不需要自旋锁 - 禁用访问与中断处理程序共享的数据的BH代码的中断就足够了。
  • 在SMP系统上,您需要一个自旋锁以防止在其他内核上执行相同的BH代码,并且,如果您处理硬件,您还需要在同一内核上禁用中断以避免使用IRQ例程进行死锁。
  • 中断处理程序总是需要在保持任何锁定时禁用中断以避免自身死锁。

希望这有帮助。