local_bh_disable,preempt_disable,local_irq_disable

问题描述 投票:4回答:2

local_bh_disable禁用下半部分(softirqs)的处理。 Softirq可以在中断返回路径上处理,也可以通过ksoftirqd(每个cpu)线程处理,如果系统承受大量softirq负载,则该线程将被唤醒。

preempt_disable禁用抢占,这意味着,在preempt_disable preemt_enable范围内执行线程时,调度程序不会将其置于休眠状态。这意味着,如果当前线程在该作用域内时发生system-timer-interrupt,则它可能会更新调度程序的帐户表,但不会将上下文切换到另一个线程。这包括softirqd。

[local_irq_disablelocal_irq_save]禁用本地CPU的中断。这意味着本地cpu将不会对任何irq作出反应,因此它将不会运行任何中断返回路径,因此无法在其中运行softirqs。

假设我的上述说法是正确的(我不确定),那么在您调用了local_bh_disablepreempt_disable之后(在过程上下文中)再调用local_irq_save是否多余?

multithreading linux-kernel interrupt-handling softirq
2个回答
3
投票

是。调用local_irq_save / disable后,就不需要进一步的保护了-您将不会被打扰(除非受到NMI或代码中的异常的影响)。

但是,通常,您会发现设计成可从不同上下文调用的代码位,因此它们可以为某些子操作提供保护,而这些子操作最终在某些路径中是多余的。


0
投票

preempt_disable / enable范围可确保该范围内的调用计划不执行任何操作(即,禁用了抢占)。但是,softirq或irq可能会打扰您。

禁用irq只会禁用硬中断,因为禁用bh(softirqs)只会禁用软件中断,但是您需要明确指定要禁用的中断。有4个级别:NMI,IRQ,softirq,进程。 NMI(不可屏蔽中断)可以中断IRQ,softirq,进程; IRQ可以中断softirq和进程。 softirqs可以中断进程。

在local_irq_save()之后调用local_bh_disable()可能是多余的(不确定),但如果要禁用BH,则绝对需要在preempt_disable()之后调用local_bh_disable()。

© www.soinside.com 2019 - 2024. All rights reserved.