在工作队列中使用 spin_lock() 与 down_interruptible()

Use spin_lock() vs down_interruptible() in workqueue

我 运行 遇到这样一种情况,即在工作队列中使用 spin_lock() 会挂起系统,以防多个中断之间的间隔太短。将 spin_lock() 更改为 down_interruptible() 后,问题暂时消失了。

但是我在内核代码 中看到了几个 下半部分 实现,它们使用 spin_lock() 而不是 mutex/semaphore(例如,request_threaded_irq() 中的 irq 函数)。那是什么原因呢?我最好的猜测是 mutex/sempahore 在这种情况下可能有点矫枉过正。

这完全取决于您尝试使用此锁保护的数据以及可以从何处(哪个上下文)访问数据(工作队列除外)。如果锁和相应的数据也可以从atomic context (such as interrupt handlers), you should use .

访问

Workqueue 是关于 process context,因此如果需要它可以进入休眠状态。在按住 spin_lock 的同时进入睡眠将是一个致命错误。因此,在工作队列中,您可以使用可休眠功能,但不能在按住 spin_lock.

时使用

信号量是像 mutexes 这样的可休眠锁,所以如果您的数据和相应的锁不会在 atomic context 中使用,我认为没有理由这样做放弃 mutexes/semaphores.

更多信息:

Interrupts, Spin Locks, and Preemption

Linux kernel interrupt handler mutex protection.