禁用抢占内核中的 Bottom Half 与内核上下文

Bottom Half vs. Kernel context in Preemption disabled kernel

快速提问。

  1. 以太网驱动程序引发 IRQ。
  2. ISR 将调度 tasklet (BH)
  3. 这个tasklet和一些内核上下文之间存在临界区(由"ioctl"触发)
  4. KERNEL_PREEMPTION 已禁用/但 CONFIG_SMP 已启用(2 个 CPU)

在这种情况下,我应该使用"spin_lock_bh"吗?

由于抢占是"disabled",即使内核上下文持有"spin_lock",tasklet 也不能​​抢占正在调用ioctl 的内核上下文,而这个内核上下文是来自BH 的"safe"。

或者会不会出现下面的情况?

当这个内核上下文得到服务时,IRQ 来了,ISR 将调度 tasklet。然后,从 IRQ 返回后,即使有内核上下文,内核调度也会选择 tasklet。

我不确定哪个是正确的?

抢占状态无关紧要。根据 ISR return,无论启用还是禁用抢占,tasklet 都可以 运行。所以,是的,你需要使用 spin_lock_bh().

关于同步问题,SoftIRQs/Tasklets表现得像ISR,唯一的区别是ISR中断BH。由于 ISR 在内核持有锁时中断了内核,所以 tasklet 也可以。