【问题标题】:Bottom Half vs. Kernel context in Preemption disabled kernel禁用抢占内核中的下半部分与内核上下文
【发布时间】:2015-02-10 07:34:45
【问题描述】:

快速提问。

  1. 以太网驱动程序提高 IRQ。
  2. ISR 将调度 tasklet (BH)
  3. 在这个 tasklet 和一些内核上下文(由“ioctl”触发)之间存在临界区
  4. 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


【解决方案1】:

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

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

【讨论】:

  • 其实,这就是我对这种情况的真正想法。调用 spin_lock_bh 的唯一原因是为了调度。但是,当 ISR 完成时,内核不会恢复以前的上下文吗?继续进行 BH 处理?
  • @user2526111 第二个是正确的。在完成 ISR 后,允许内核执行 BH。即使被中断的进程持有锁,也会发生这种情况。另一方面,您提到有 2 个 CPU,这意味着您需要一个自旋锁(您可以让两个进程同时访问临界区)。
  • 同意。我绝对需要“spin_lock”。但是,我想知道......关于 local_bh_disable......
  • @user2526111 正如我上面提到的,抢占状态与 IRQ 和 SoftIRQ/Tasklet 无关。所以是的,您还需要 local_bh_disable。如您所知,spin_lock_bh 两者都可以。
猜你喜欢
  • 2013-11-13
  • 1970-01-01
  • 2015-03-05
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 2018-09-16
  • 1970-01-01
相关资源
最近更新 更多