在工作队列中使用 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.
我 运行 遇到这样一种情况,即在工作队列中使用 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.