中断上下文中的spin_lock_irqsave()

时间:2018-06-01 06:40:36

标签: c linux-kernel linux-device-driver

我正在维护一个驱动程序,它在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()?我倾向于后者,原因有两个:

  1. 只要有人看到使用spin_lock_irqsave()获取锁定,很明显锁定旨在与中断上下文共享。
  2. 作为维护代码的人,您无需确定是否将在何种上下文中调用特定函数。换句话说,使用spin_lock_irqsave()可以在任何上下文中工作,因此您不必确保仅在特定上下文中调用函数。
  3. 如上所述,我想知道驻留在内核空间中的代码的约定/最佳实践是什么。在获取锁定的任何地方使用spin_lock_irqsave()是否更好,即使您可以保证从中断上下文中获取锁定?

0 个答案:

没有答案