禁用抢占内核中的 Bottom Half 与内核上下文
Bottom Half vs. Kernel context in Preemption disabled kernel
快速提问。
- 以太网驱动程序引发 IRQ。
- ISR 将调度 tasklet (BH)
- 这个tasklet和一些内核上下文之间存在临界区(由"ioctl"触发)
- 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 也可以。
快速提问。
- 以太网驱动程序引发 IRQ。
- ISR 将调度 tasklet (BH)
- 这个tasklet和一些内核上下文之间存在临界区(由"ioctl"触发)
- 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 也可以。