首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SOFTIRQ上下文中的抢占

SOFTIRQ上下文中的抢占
EN

Stack Overflow用户
提问于 2017-08-19 00:48:56
回答 1查看 1.7K关注 0票数 2

我有一个系统,有以下配置;

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

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

这是正确的陈述吗?

另一个问题。此时,如果SOFTIRQ 1禁用了"bottom_half",那么我们在哪里检测下半部分是禁用的,并跳过SOFTIRQ 2的执行?提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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():

代码语言:javascript
复制
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中的内容:

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45766649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档