我一直在研究Linux中的interrupts,特别是softirq (我对内核的网络子系统感兴趣)。我理解上半部分和下半部分的概念,但我不清楚的是-- softirq上下文持续了多久?在内核堆栈中的哪个点之前,我们要处理softirq?例如,当入口路径到达ip_rcv()时,我们是否仍然处于软中断模式?
发布于 2020-12-02 17:35:13
粗鲁地说,softirq上下文一直持续到软处理程序返回为止。
ip_rcv(),我们还处于软中断模式吗?
是的,我们现在的情况是温和的。我们在函数的呼叫堆栈中,它被作为NET_RX_SOFTIRQ提出。
让我们讨论一下接收路径,考虑NAPI。
____napi_schedule()会引发NET_RX_SOFTIRQ (它反过来通过访问irq_stat.__softirq_pending来修改每个CPU的数据结构)。然后,softirq处理程序将数据包向上移动到堆栈。所有这些操作都是在软上下文中进行的。因此,这里有两个不同的方向: 1)这是前向数据包,所以softirq上下文一直持续到将该数据包添加到某个输出队列并返回处理程序为止。2)这是本地输入包,所以软包一直持续到将该包添加到本地套接字接收队列(排队),然后处理程序返回。这样的事情是在网络堆栈中任何地方丢失的情况下发生的。当基本的softirq函数/处理程序终止时,它都会终止。
https://stackoverflow.com/questions/64380158
复制相似问题