gpt4 book ai didi

linux-kernel - SOFTIRQ 上下文中的抢占

转载 作者:行者123 更新时间:2023-12-02 20:42:16 24 4
gpt4 key购买 nike

我有一个具有以下配置的系统;

  • SMP平台(但我只关心本地CPU)和抢占关闭
  • ISR A -> raise_softirq(1)
  • ISR B -> raise_softirq(2)

当 SOFTIRQ 1 运行时,中断 B 到来,然后 ISR B 启动。当 irq_exit() 发生在 ISR B 时,它将调用软中断。因此,它将调度 SOFTIRQ 2(不考虑被中断的 SOFTIRQ 1)。

这种说法正确吗?

另一个问题。此时,如果SOFTIRQ 1禁用了“bottom_half”,我们在哪里检测bottom half被禁用并跳过SOFTIRQ 2的执行?提前致谢!

最佳答案

也许您对 SOFTIRQ 和 HARDIRQ 感到困惑。 Linux内核中的Softirq是IRQ处理中的“bottom_half”,由任务调度器调度执行,以处理延迟的IRQ处理。在此处理过程中,它可能会处理多个延迟 IRQ 处理,例如您的情况下的 IRQ A 和 IRQ B。

但是如果有任何IRQ进入系统,就会触发ISR处理程序,并且不会立即触发任何SOFTIRQ,只是安排稍后处理,而不是像你的措辞那样“调用”说。 (即,所有硬件 IRQ 处理程序不应调用 raise_softirq(),而是安排一个处理程序进行 IRQ 处理)

总而言之,对于您的场景:

ISR B 结束后,它可能会提交 SOFTIRQ B 供以后处理 - 但它不会调用 raise_softirq()。但由于 SOFTIRQ A 已被中途拦截,任何硬件中断后,它都会继续之前的最后任务,因此 SOFTIRQ A 将执行完成。

详细说明raise_softirq()内部,它调用raise_softirq_irqoff():

inline void raise_softirq_irqoff(unsigned int nr)
{
__raise_softirq_irqoff(nr);

/*
* If we're in an interrupt or softirq, we're done
* (this also catches softirq-disabled code). We will
* actually run the softirq once we return from
* the irq or softirq.
*
* Otherwise we wake up ksoftirqd to make sure we
* schedule the softirq soon.
*/
if (!in_interrupt())
wakeup_softirqd();
}

正如评论所说,如果您在软中断 A 内且 IRQ B 进入,则 IRQ B 处理将结束 - 在完成当前的 SOFTIRQ A 后重新运行。

为了强调所有硬件都不会调用“raise_softirq()”,对 Linux 内核的搜索会产生以下结果(没有一个来自硬件,来自“drivers”分支):

enter image description here

在网络 IRQ 处理程序中 - 调用 napi_schedule()。 (通常在所有驱动程序 IRQ 处理程序中搜索“sched”)。以下来自 drivers/net/usb/r8152.c:

enter image description here

关于linux-kernel - SOFTIRQ 上下文中的抢占,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45766649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com