在多个中断之间的间隔太短的情况下,在工作队列中使用spin_lock()
会使系统挂起。将spin_lock()
更改为down_interruptible()
之后,此问题暂时消失了。
但是,我在内核代码中看到了几个下半部分实现,它们使用spin_lock()
而不是互斥/信号量(例如,{ {1}})。那是什么原因呢?我最好的猜测是,在这种情况下,互斥体/后代可能会过大。
答案 0 :(得分:4)
这完全取决于您要使用此锁尝试保护的数据以及可以从何处(哪个上下文)访问数据(工作队列之外)。如果还可以从 atomic context (例如中断处理程序)访问锁和相应的数据,则应使用appropriate locking。
工作队列是关于 流程上下文 的,因此必要时可以进入睡眠状态。同样,在握住spin_lock
的情况下入睡也是一个致命的错误。因此,在工作队列中,您可以使用可睡眠的功能,但在按住spin_lock
时不能使用。
信号量是可休眠的锁,例如mutexes,因此,如果不会在原子上下文中使用您的数据和相应的锁,我认为没有理由放弃互斥量/信号量
更多信息: