local_bh_disable禁用对下半部分(软中断)的处理。软中断在中断返回路径上处理,或者由ksoftirqd-(每个cpu)-thread处理,如果系统遭受重的软中断负载,它将被唤醒。
preempt_disable禁用抢占,这意味着当线程在preempt_disable <-> preemt_enable作用域中执行时,调度器不会将其置于睡眠状态。这意味着,如果当前线程在该作用域内时发生系统计时器中断,它可能会更新调度器的记帐表,但不会将上下文切换到另一个线程。这包括softirqd。
local_irq_disable或local_irq_save禁用本地中央处理器的中断。这意味着本地cpu不会对任何irqs做出反应,因此它不会运行任何中断返回路径,因此不能在那里运行软中断。
假设我上面的陈述是真的(我不确定),那么在调用preempt_disable和local_irq_save (在进程上下文中)之后调用local_bh_disable不是多余的吗?
发布于 2014-06-18 05:02:50
是。一旦调用了local_irq_save / disable,就不需要进一步的保护--您不会被中断(除非被NMI或代码中的异常中断)。
然而,您经常会发现一些代码被设计为可从不同的上下文调用,因此它们可能会为某些子操作提供保护,这些子操作最终在某些路径中是冗余的。
发布于 2020-05-21 22:09:31
preempt_disable/enable作用域确保该作用域内的呼叫调度不执行任何操作(即禁用抢占)。但是,softirq或irq可能会打断您。
禁用irq只会禁用硬中断,因为禁用bh(softirqs)只会禁用软件中断,但您需要明确指定要禁用哪个中断。它有4个层次: NMI、IRQ、softirq、process。NMI(不可屏蔽中断)可以中断IRQ、软中断、进程;IRQ可以中断软中断和进程;软中断可以中断进程。
在local_irq_save()之后调用local_bh_disable()可能是多余的(不确定),但是如果您想禁用BH,那么在preempt_disable()之后调用local_bh_disable()肯定是必要的。
https://stackoverflow.com/questions/24260087
复制相似问题