我一直被教导,在内核代码中按住自旋锁的同时睡觉是不行的。原因如下:
我正在维护一个使用大量锁的驱动程序,并且在某些锁定的部分内是显而易见的事情,例如内存分配copy_to_user()
等。
但是,我并不完全相信自己手上有一个错误。在上述情况下,线程A是用户上下文(即在的实现内read()
),而线程B是中断上下文(在ISR内)。锁通过锁定spin_lock_irqsave()
。结果,线程B无法在线程A持有锁的同时运行,从而使死锁变得不可能。
我还考虑了以下内容:
read()
)。由于其他适当的机制,这不可能发生。有什么我想念的吗?在我上面所描述的内容中,握住锁时是否有与睡觉有关的真正危险?
这个问题不累加。
使用上面的场景,线程A是用户上下文(即在read()的实现内),而线程B是中断上下文(在ISR内)。该锁通过spin_lock_irqsave()锁定。结果,线程B无法在线程A持有锁的同时运行,从而使死锁变得不可能。
如果您在copy_to_user和friends之间保持自旋锁,则带有debug的内核会警告您您做错了。如果需要使线程进入睡眠状态,它将进入睡眠状态。然后,您回到第一个方框。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句