softirq——它在网络堆栈中持续多长时间?

softirq -- how far in network stack does it last?

我一直在研究 Linux 中的 interrupts,尤其是 softirq(我对内核的网络子系统感兴趣)。我理解上半部分和下半部分的概念,但我不清楚的是 - softirq 上下文持续多长时间?我们处理 softirq 内核堆栈中的哪一点?例如,当入口路径命中ip_rcv()时,我们是否仍处于软中断模式?

粗略地说,softirq 上下文持续到 softirq-handler returns。

ip_rcv(), are we still in soft interrupt mode

是的,我们处于软中断环境中。我们在 call-stack 函数中,它被提升为 NET_RX_SOFTIRQ.

让我们谈谈考虑 NAPI 的接收路径。
____napi_schedule() 引发 NET_RX_SOFTIRQ(它又通过访问 irq_stat.__softirq_pending 修改每个 CPU 数据结构)。然后 softirq 处理程序将数据包向上移动到堆栈。所有这些操作都在 softirq 上下文中。所以这里有两个不同的方向:1)这是转发数据包 - 所以软中断上下文一直持续到这个数据包将被添加到某个输出队列并且处理程序将 return。 2) 这是本地输入数据包——所以软中断一直持续到这个数据包被添加(入队)到本地套接字接收队列,之后处理程序 returns。这样的事情是为了防止在网络堆栈中的任何地方掉线。当基本 softirq-function/handler 终止时,一切都终止。