我有一些在SMP ARM上的tasklet,计时器和kthread之间共享的数据。使用什么类型的旋转锁是什么?
根据Cheat Sheet For Locking,似乎常规spin_lock()
/ spin_unlock()
可以完成这项工作。但由于这纯粹是下半部分,不应该spin_lock_bh()
足够吗?
谢谢!
答案 0 :(得分:0)
您需要在此处使用spin_lock_bh
,因为您在tasklet和kthread之间共享数据结构。
仅使用spin_lock可能会导致死锁:
答案 1 :(得分:0)
spin_lock()可能会导致死锁问题。考虑这样一种情况:进程获取关键部分的锁定,并且软件中断到达同一个CPU,该CPU也尝试获取进程具有的相同锁定。这是死锁的情况,没有任何进程可以向前发展。因此,我们要求在CPU上获取自旋锁时,应禁用本地软件中断。这是通过spin_lock_bh()完成的。
因此,当在进程上下文和下半部分之间共享数据结构时,它由spin_lock_bh()保护。
但是,除非有必要,否则不建议在进程上下文和下半部分之间共享数据结构。每个cpu变量可以替代以避免锁定。