【发布时间】:2015-02-10 07:34:45
【问题描述】:
快速提问。
- 以太网驱动程序提高 IRQ。
- ISR 将调度 tasklet (BH)
- 在这个 tasklet 和一些内核上下文(由“ioctl”触发)之间存在临界区
- KERNEL_PREEMPTION 已禁用/但 CONFIG_SMP 已启用(2 个 CPU)
在这种情况下,我应该使用“spin_lock_bh”吗?
由于“禁用”抢占,即使内核上下文持有“spin_lock”,tasklet 也无法抢占调用 ioctl 的内核上下文,并且此内核上下文对 BH 来说是一种“安全”。
或者是否有可能发生以下情况?
当这个内核上下文得到服务时,IRQ 来了,ISR 将调度 tasklet。然后,从 IRQ 返回后,即使有内核上下文,内核调度也会拾取 tasklet。
我不确定哪个是正确的?
【问题讨论】:
-
你读过 Rusty 的Unreliable Guide To Locking吗?
-
是的。它仅涵盖 PREEMPTION 启用情况或 PREEMPTION 和 SMP 都被禁用。我想知道的是,CONFIG_SMP=y and No preemption configuration,softirq是怎么执行的。
-
无论配置如何,API都是一样的。
-
我只是想知道,下半部分可以抢占内核上下文(不在 ISR/BH 中的内核线程)。另外,想知道 ISR 何时调度 BH,无论当前正在运行的线程如何,都会执行它。谢谢!
-
内核和“普通”线程在这方面没有什么不同。
标签: linux-kernel device-driver