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

时间:2018-10-23 04:42:02

标签: c linux-kernel mutex interrupt spinlock

在多个中断之间的间隔太短的情况下,在工作队列中使用spin_lock()会使系统挂起。将spin_lock()更改为down_interruptible()之后,此问题暂时消失了。

但是,我在内核代码中看到了几个下半部分实现,它们使用spin_lock() 而不是互斥/信号量(例如,{ {1}})。那是什么原因呢?我最好的猜测是,在这种情况下,互斥体/后代可能会过大。

1 个答案:

答案 0 :(得分:4)

这完全取决于您要使用此锁尝试保护的数据以及可以从何处(哪个上下文)访问数据(工作队列之外)。如果还可以从 atomic context (例如中断处理程序)访问锁和相应的数据,则应使用appropriate locking

工作队列是关于 流程上下文 的,因此必要时可以进入睡眠状态。同样,在握住spin_lock的情况下入睡也是一个致命的错误。因此,在工作队列中,您可以使用可睡眠的功能,但在按住spin_lock时不能使用。

信号量是可休眠的锁,例如mutexes,因此,如果不会在原子上下文中使用您的数据和相应的锁,我认为没有理由放弃互斥量/信号量

更多信息:

Interrupts, Spin Locks, and Preemption

Linux kernel interrupt handler mutex protection

相关问题