快速提问。
在这种情况下,我应该使用" spin_lock_bh"?
由于抢占被禁用",即使内核上下文保持" spin_lock",tasklet也不能抢占调用ioctl的内核上下文,并且这个内核上下文是一种"安全"来自BH。
或是否有可能发生以下情况?
当这个内核上下文得到服务时,IRQ来了,ISR将调度tasklet。然后,从IRQ返回后,即使存在内核上下文,内核调度也会拾取tasklet。
我不确定哪一个是正确的?
答案 0 :(得分:1)
抢占状态无关紧要。从ISR返回后,无论是启用还是禁用抢占,tasklet都可以运行。所以,是的,你需要使用spin_lock_bh()
。
关于同步问题,SoftIRQ / Tasklet的行为与ISR类似,唯一的区别是ISR中断BH。由于ISR在持有锁时中断了内核,因此tasklet也可以。