我一直在研究interrupts
Linux,softirq
特别是(我对内核的网络子系统感兴趣)。我理解上半部分和下半部分的概念,但我不清楚的是——softirq
上下文持续多远?直到我们处理内核堆栈中的哪一点softirq
?例如,当入口路径命中时ip_rcv()
,我们是否仍处于软中断模式?
问问题
116 次
1 回答
2
粗鲁地说,softirq 上下文一直持续到 softirq-handler 返回。
ip_rcv(),我们还处于软中断模式吗
是的,我们在 softirq 上下文中。我们在函数的调用堆栈中,它被提升为NET_RX_SOFTIRQ
.
让我们谈谈考虑 NAPI 的接收路径。
____napi_schedule()
raises NET_RX_SOFTIRQ
(它反过来通过访问修改每个 CPU 的数据结构irq_stat.__softirq_pending
)。然后软中断处理程序将数据包向上移动到堆栈。所有这些动作都在 softirq 上下文中。所以这里有两个不同的方向:1)这是转发数据包——所以softirq上下文一直持续到这个数据包被添加到某个输出队列并且处理程序将返回。2) 这是本地输入数据包 - 所以软中断一直持续到该数据包将被添加(入队)到本地套接字接收队列,之后处理程序返回。这样的事情是在网络堆栈中的任何地方丢失的情况下。当基本的软中断函数/处理程序终止时,这一切都终止了。
于 2020-12-02T17:35:13.013 回答