Preemption禁用内核中的下半部分与内核上下文

时间:2015-02-10 07:34:46

标签: linux-kernel device-driver

快速提问。

  1. 以太网驱动程序提升IRQ。
  2. ISR将安排tasklet(BH)
  3. 此tasklet与某些内核上下文之间存在关键部分(由#34; ioctl&#34触发;)
  4. KERNEL_PREEMPTION已禁用/但CONFIG_SMP已启用(2个CPU)
  5. 在这种情况下,我应该使用" spin_lock_bh"?

    由于抢占被禁用",即使内核上下文保持" spin_lock",tasklet也不能抢占调用ioctl的内核上下文,并且这个内核上下文是一种"安全"来自BH。

    或是否有可能发生以下情况?

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

    我不确定哪一个是正确的?

1 个答案:

答案 0 :(得分:1)

抢占状态无关紧要。从ISR返回后,无论是启用还是禁用抢占,tasklet都可以运行。所以,是的,你需要使用spin_lock_bh()

关于同步问题,SoftIRQ / Tasklet的行为与ISR类似,唯一的区别是ISR中断BH。由于ISR在持有锁时中断了内核,因此tasklet也可以。