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

问题描述

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

解决方法

粗略地说,softirq上下文一直持续到softirq处理程序返回为止。

ip_rcv(),我们仍处于软中断模式

是的,我们处于softirq环境中。我们位于函数call-stack的内部,它被提升为NET_RX_SOFTIRQ

让我们谈谈考虑NAPI的接收路径。
____napi_schedule()引发NET_RX_SOFTIRQ(通过访问irq_stat.__softirq_pending依次修改每个CPU的数据结构)。然后softirq处理程序将数据包移至堆栈。所有这些动作都在softirq上下文中。因此,这里有两个不同的方向:1)这是前向数据包-因此softirq上下文持续存在,直到将该数据包添加到某个输出队列中并且处理程序将返回为止。 2)这是本地输入数据包-因此softirq一直持续到此数据包将被添加(排队)到本地套接字接收队列之后,处理程序才返回。这种情况是在网络堆栈中的任何地方掉线的情况下发生的。当基本的softirq-function / handler终止时,它们全部终止。