Linux - 在SMP ARM上锁定计时器,tasklet和kthread

时间:2016-04-09 20:13:14

标签: linux linux-kernel locking spinlock smp

我有一些在SMP ARM上的tasklet,计时器和kthread之间共享的数据。使用什么类型的旋转锁是什么?

根据Cheat Sheet For Locking,似乎常规spin_lock() / spin_unlock()可以完成这项工作。但由于这纯粹是下半部分,不应该spin_lock_bh()足够吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

您需要在此处使用spin_lock_bh,因为您在tasklet和kthread之间共享数据结构。

仅使用spin_lock可能会导致死锁:

  1. kthread锁定
  2. irq发生
  3. softirq在离开irq context
  4. 后运行
  5. 您的tasklet运行
  6. tasklet尝试锁定

答案 1 :(得分:0)

spin_lock()可能会导致死锁问题。考虑这样一种情况:进程获取关键部分的锁定,并且软件中断到达同一个CPU,该CPU也尝试获取进程具有的相同锁定。这是死锁的情况,没有任何进程可以向前发展。因此,我们要求在CPU上获取自旋锁时,应禁用本地软件中断。这是通过spin_lock_bh()完成的。

因此,当在进程上下文和下半部分之间共享数据结构时,它由spin_lock_bh()保护。

但是,除非有必要,否则不建议在进程上下文和下半部分之间共享数据结构。每个cpu变量可以替代以避免锁定。