我有一个系统,有以下配置;
当SOFTIRQ 1运行时,中断B出现,然后ISR B启动。当irq_exit()发生在ISR时,它将调用softirq。因此,它将调度SOFTIRQ 2(而不考虑被中断的SOFTIRQ 1)。
这是正确的陈述吗?
另一个问题。此时,如果SOFTIRQ 1禁用了"bottom_half",那么我们在哪里检测下半部分是禁用的,并跳过SOFTIRQ 2的执行?提前感谢!
发布于 2017-08-19 03:47:24
也许您混淆了SOFTIRQ和HARDIRQ。Linux内核中的Softirq是IRQ处理中的"bottom_half“,它是由任务调度程序执行的调度,用于处理延迟的IRQ处理。在这个处理过程中,它可以处理多个延迟的IRQ处理,比如IRQ A和IRQ B。
但是,如果任何IRQ进入系统,它将触发ISR处理程序,并且不会立即触发任何SOFTIRQ,只计划在以后处理,而不是像您的措辞所说的“调用”。(也就是说,所有硬件IRQ处理程序都不应该调用raise_softirq(),而是为IRQ处理安排一个处理程序)
总之,对于您的场景:
ISR B结束后,它可能会提交SOFTIRQ供以后的处理-,但它没有调用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();
}正如注释所指出的,如果您在softirq和IRQ B中,IRQ B处理将结束--在它完成当前的SOFTIRQ A之后重新运行。
为了强调所有硬件都不调用"raise_softirq()",对linux内核的搜索会产生以下结果(没有一个来自硬件,它来自“驱动程序”分支):

在网络IRQ处理程序中,调用napi_schedule()。(通常在所有驱动程序IRQ处理程序中搜索"sched“)。以下是驱动程序/net/usb/r8152.c中的内容:

https://stackoverflow.com/questions/45766649
复制相似问题