【问题标题】:How kernel disable the softirq in the local processor when softirq handler runssoftirq处理程序运行时内核如何禁用本地处理器中的softirq
【发布时间】:2016-01-07 14:15:19
【问题描述】:

最近我在研究 Robert Love 的 Linux-Kernel-Development。

有一段描述softirq的机制。

softirq 处理程序在启用中断的情况下运行并且不能休眠。 当处理程序运行时,当前处理器上的软中断被禁用。 然而,另一个处理器可以执行其他软中断。

我不明白“当前处理器上的软中断已禁用”的含义。

这是否意味着在运行 __do_softirq 时,即使 softirq_pending 中的某些位再次升高,__do_softirq 函数也不能被中断?如果是,那么 __do_softirq 中的哪些语句做了这种保护?

在跟踪__do_softirq中的代码时,发现有一对__local_bh_disable和__local_bh_enable函数。

他们是否禁用了本地软中断?

谢谢。

【问题讨论】:

    标签: linux-kernel softirq


    【解决方案1】:

    是的,__local_bh_disable__local_bh_enable 禁用和启用当前 CPU 上的软中断处理。 Softirqs 也被称为“下半部分”,这就是那些名称中的“bh”所代表的含义。

    【讨论】:

    • 所以如果有另一个中断再次使softirq_pending中的位,调度器只会调度到另一个cpu[如果存在多个cpu]对吗?
    • 我也很困惑,如果 __do_softirq 调用了 __local_bf_disable,为什么它又调用了 local_irq_enable?这两个功能之间似乎矛盾?这两个功能有什么区别?非常感谢。
    • 如果另一个软中断在这个 CPU 上挂起,它不会执行,直到当前执行的软中断完成。 local_irq_enable 是允许硬件中断中断软中断处理程序。它们只是被禁用以允许读取和清零待处理的软中断集,而无需使用硬中断更改它。
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多