Linux kernel 在Linux中暂停kthread

Linux kernel 在Linux中暂停kthread,linux-kernel,softirq,Linux Kernel,Softirq,这里 上面写着: 正如你在上一篇文章中看到的,NET_TX_SOFTIRQ SOFTIRQ 注册到它的函数net_tx_action。这意味着有 执行net_tx_操作的内核线程。那根线偶尔会断 暂停并启动\u softirq\u irqoff将继续。让我们来看看什么 net_tx_操作这样做是为了让我们了解内核是如何处理的 发送请求 据说kthread偶尔会暂停。当kthread暂停时,原因是什么 kthread如何知道要执行的工作?它是否轮询队列 我认为关于暂停线程的说法更像是一种修辞。在本

这里 上面写着:

正如你在上一篇文章中看到的,NET_TX_SOFTIRQ SOFTIRQ 注册到它的函数net_tx_action。这意味着有 执行net_tx_操作的内核线程。那根线偶尔会断 暂停并启动\u softirq\u irqoff将继续。让我们来看看什么 net_tx_操作这样做是为了让我们了解内核是如何处理的 发送请求

据说
kthread
偶尔会暂停。当
kthread
暂停时,原因是什么


kthread如何知道要执行的工作?它是否轮询队列

我认为关于暂停线程的说法更像是一种修辞。在本例中,暂停的不是
kthread
,线程工作正常

与softirq相关的工作主体位于
\uu do\u softirq()
函数中

有许多softirq类型,每个softirq类型都由位掩码中的一个位表示。每当有针对特定类型softirq的工作时,相应的位就会在位掩码中提升
\uuu do\u softirq()
从最低有效位开始逐位处理此位掩码,并对设置了位的每种softirq类型进行处理。因此,softirq类型按优先级顺序处理,位0表示最高优先级。事实上,如果您查看代码,您将看到位掩码被保存(复制),然后在处理开始之前被清除,处理的是副本

每当向内核网络堆栈提交新的skb以发送数据时,
NET\u TX\u SOFTIRQ
的位就会升高。这会导致
\u do\u softirq()
调用
net\u tx\u action()
以获取传出数据。如果没有要发送的数据,则不会提升位。本质上,这就是导致内核softirq线程“暂停”的原因,这只是一种外行的方式,表示它没有工作,因此不调用
net\u tx\u action()
。一旦有更多的数据,当数据提交到内核网络堆栈时,该位就会再次提升
\uuu do\u softirq()
看到这个,并再次调用
net\u tx\u action()

每个CPU上都有一个softirq线程。当至少有一个挂起的softirq类型时,线程运行。线程在
softirq\u threads
结构中定义,并在
spawn\u softirqd()
函数中启动