我正在维护一个驱动程序,它在ISR(即中断上下文)和read()
系统调用之间共享一些资源。在这两种情况下,都使用spin_lock_irqsave()
,因为(显然)可以在中断上下文中获取资源。
但是,我想知道在中断上下文中是否需要使用spin_lock_irqsave()
。也就是说,不可靠的锁定指南(见这里:https://kernel.readthedocs.io/en/sphinx-samples/kernel-locking.html)说明:
请注意,
spin_lock_irqsave()
如果打开则会关闭中断,否则什么也不做(如果我们已经在中断处理程序中),因此这些函数可以安全地从任何上下文调用。
因此,通常的做法是在中断处理程序中使用“normal”spin_lock()
(因为已经禁用了特定的中断),然后在用户上下文中调用spin_lock_irqsave()
?或者,更好的做法是在任何地方使用spin_lock_irqsave()
?我倾向于后者,原因有两个:
spin_lock_irqsave()
获取锁定,很明显锁定旨在与中断上下文共享。spin_lock_irqsave()
可以在任何上下文中工作,因此您不必确保仅在特定上下文中调用函数。如上所述,我想知道驻留在内核空间中的代码的约定/最佳实践是什么。在获取锁定的任何地方使用spin_lock_irqsave()
是否更好,即使您可以保证从中断上下文中获取锁定?